スレッド間通信に問題があり、 "ダミーメッセージ"を全面的に使用して解決しました。これは悪い考えですか?可能な解決策は何ですか?プロデューサ - コンシューマ間スレッド間通信
例問題があります。
メインスレッドは、レコードを処理してデータベースに挿入するスレッドを開始します。 メインスレッドは、おそらく巨大なファイルを読み取り、1つのレコード(オブジェクト)を次々にブロッキングキューに格納します。処理スレッドはキューから読み込み、動作します。
「スレッドの処理」にはどのように停止する必要がありますか? キューは空でもかまいませんが、作業は完了せず、スレッドの処理が完了してもそれを中断することはできません。
だから、処理スレッドは挿入が同じトランザクションおよびトランザクションでなければならないこと
while (queue.size() > 0 || !Thread.currentThread().isInterrupted()) {
MyObject object= queue.poll(100, TimeUnit.MILLISECONDS);
if (object != null) {
String data = object.getData();
if (data.equals("END")) {
break;
}
// do work
}
}
// clean-up
synchronized queue) {
queue.notifyAll();
}
return;
とメインスレッド
// ...start processing thread...
while(reader.hasNext(){
// ...read whole file and put data in queue...
}
MyObject dummy = new MyObject();
dummy.setData("END");
queue.put(dummy);
//Note: empty queue here means work is done
while (queue.size() > 0) {
synchronized (queue) {
queue.wait(500); // over-cautios locking prevention i guess
}
}
注メインスレッドで を扱うことができないん。
これを行うにはどうすればよいでしょうか? (私は学んでおり、「間違ったやり方」を始めたくない)
渡されたオブジェクトの型に、このために簡単に使用できる文字列フィールドがない場合は、どうすれば使用できますか?テキストが有効なデータである可能性があり、したがって毒と等しい場合はどうなりますか? GUIDを使用しますか? –
理想的には、MyObjectクラスを変更してisPoison()メソッドをそこに追加します。このメソッドがオブジェクトが毒であるかどうかを判断する方法はあなた次第ですが、メッセージがヌル、空であるかどうか、またはメッセージが明示的に毒として作成されたかどうかを比較するなどの簡単なことがあります。アイデアは、MyObjectを2つの実装、つまりisPoison()メソッドで常にfalseを返すMessageObjectとPoisonMessage(常にtrueを返す)とのインタフェースになるようにリファクタリングすることです。しかし、これは深くあなたが何をしているのかに大きく依存しており、実際の状況を考えれば、より良い解決策が存在する可能性があります。 –