私は間違いなく同時実行地獄にいます。私がやろうとしていることに対する良い/効率的な解決策を見つけることができません。テキスト ファイルを読み取り、その情報を共有 BlockedQueue に入れるプロデューサー スレッドがあります。また、共有 BlockedQueue を使用してデータを読み取り、データに対して重い処理を行う Consumer があります。Start、Pause、Stopの 3 つのボタンを備えた GUI があります。
Producer と Consumer はどちらも Runnable を実装し、それぞれの計算に関する情報にアクセスするためのメソッドを提供します (たとえば、いくつかの統計やいくつかのオブジェクトを返します)。
[開始] オプションを使用して、Producer がファイルを開き、BlockedQueue へのデータの挿入を開始するようにします。また、コンシューマーはデータの取得を開始し、その計算を行います。
Pauseオプションを使用して、Producer がデータを BlockedQueue に入れるのを停止させたいのですが、同時に Producer のインスタンス変数にアクセスできるようにしたいと考えています。コンシューマについても同じことが言えます。私は重いことをやめたいと思っていますが、コンシューマで定義されたいくつかのインスタンス変数とメソッドにアクセスできるようにしたいと考えています。
停止オプションを使用して、プロデューサーとコンシューマーをリセットしたい...つまり、クリーンから開始するかのように。
私の質問は、これを効率的に実装する方法ですか? 特に一時停止を確認するには?
この擬似コードのようなものは効率的でしょうか?
Enum state;
class Producer implements Runnable {
public List someList;//accessed from the event-dispatching thread
public void Run() {
synchronized(state) {
if(state == Enum.paused) {
//do nothing
}
else if(state == Enum.running) {
//put stuff into BlockedQueue
}
else if (state == Enum.stopped) {
// reopen file and set state = running
}
}
}
}
class Consumer implements Runnable {
public Map someMap;//accessed from the event-dispatching thread
public void Run() {
synchronized(state) {
if(state == Enum.paused) {
//do nothing
}
else if(state == Enum.running) {
//start consuming from the BlockedQueue and do heavy computation
}
else if (state == Enum.stopped) {
// clear stuff to start clean and set state = running
}
}
}
}