1

メインスレッドから3つのワーカースレッドがあります。メインスレッドはオブジェクトをBlockingQueueに配置します。キューに十分なデータがない場合は、オブジェクトを1つだけとしましょう。他の2つのスレッドは待機状態を維持します。( queue.take()の呼び出しのために)他の2つの待機中のスレッドに終了するように通知するにはどうすればよいですか?

これを行う1つの方法は、キューの最後のダーティオブジェクトを渡して、他の古いスレッドを読み取って終了させることです。他に利用できるエレガントなソリューションはありますか?

public void run() {
if (log.isInfoEnabled()) {
    log.info("Entering method 'run' " + this.getName());
}
try {
    while (!noMoreData || !queue.isEmpty()) {
        String data = queue.take();
        ...
        ...
        doSomething();
    }
    if (log.isInfoEnabled()) {
        log.info("noMoreData =" + noMoreData + ", queue empty=" + queue.isEmpty() + "....Terminating thread..." + this.getName());
    }
} catch (InterruptedException ie) {
    log.error(ie);
} finally {
    //DONE SIGNAL
    doneSignal.countDown();
    log.info(this.getName() + " finished.");
}
}
4

2 に答える 2

1

構成されたキュー(サイズとデータ構造)を使用してExecutorServiceを使用する必要があります。

次に、#shutdown()を呼び出すexecutorserviceに送信するシャットダウンメッセージ(Runnable)があります。そのメッセージをキューの最後に送信するだけです。

この方法は、executorserviceを真のメッセージキューに置き換えることができるため、非常にスケーラブルです。

于 2012-12-07T23:44:38.403 に答える
1

Thread.interrupt()はあなたのニーズに合いますか?3つのスレッドへの参照を保持している場合は、他の2つのスレッドに割り込んで、take()メソッドにInterruptedExceptionをスローさせることができます。

于 2012-12-07T23:44:52.510 に答える