10

Java アプリにサブスクリプションを実装しました。新しいサブスクライバーが追加されると、アプリケーションは新しいタスク (Runnable別のスレッドで実行されるように実装するクラス) を作成し、次のExecutorServiceように追加されます。

public void Subscribe()
{
    es_.execute(new Subscriber(this, queueName, handler));
}

//...

private ExecutorService es_;

アプリケーションは、必要な数のサブスクライバーを登録できます。Unsubscribeここで、すべてのサブスクライバーがメッセージ フローを停止できるように、次のようなものを実装したいと考えています。ここで、 で実行中のタスクの 1 つを停止する方法が必要ですExecutorService。しかし、どうすればこれができるのかわかりません。

およびそのExecutorService.shutdown()バリエーションは私には向いていません。それらはすべてのタスクを終了します。そのうちの 1 つだけを終了したいのです。私は解決策を探しています。できるだけシンプルに。ありがとう。

4

2 に答える 2

13

代わりにExecutorService#submitexecuteを使用し、返されたオブジェクトを使用して、 Future#cancelFutureを使用してタスクをキャンセルしようとすることができます。

Subscriber例 (が であると仮定Runnable):

Future<?> future = es_.submit(new Subscriber(this, queueName, handler));
...
future.cancel(true); // true to interrupt if running

コメントからの重要な注意事項:

If your task doesn't honour interrupts and it has already started, it will run to completion.

于 2012-12-18T09:14:38.440 に答える
3

を使用する代わりに、 を使用してExecutorService.execute(Runnable) みてくださいFuture<?> submit(Runnable)Runnableこのメソッドは、実行のために をプールに送信し、Futureオブジェクトを返します。これにより、すべてのサブスクライバー スレッドへの参照が作成されます。

特定のスレッドを停止するには、 を使用するだけfutureObj.cancel(true)です。これにより、実行中のスレッドが中断され、InterruptedException. サブスクライバ スレッドは、この例外が発生した場合に処理を停止するようにコーディングする必要があります (たとえばThread.sleep(millis)、メソッド全体のラッパーの try / catch ブロックを使用)。

公式 API の詳細については、 http ://docs.oracle.com/javase/6/docs/api/java/util/concurrent/Future.html http://docs.oracle.com/javase/6を参照してください。 /docs/api/java/util/concurrent/ExecutorService.html

于 2012-12-18T09:29:27.900 に答える