2012-12-18 17 views
7

Javaアプリケーションでサブスクリプションを実装しました。新しいサブスクライバを追加すると、アプリケーションが新しいタスク(Runnableを実装するクラス別のスレッドで実行される)、それをExecutorServiceのように追加されたを作成します。あなたが望む限り多くの加入者を登録することがExecutorServiceに送信されたRunnableを停止します

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

//... 

private ExecutorService es_; 

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

ExecutorService.shutdown()とその変形は私のためではありません。すべてのタスクを終了します。そのうちの1つを終了するだけです。私は解決策を探しています。可能な限り簡単です。ありがとう。

答えて

8

あなたが代わりにexecuteExecutorService#submitを使用してFuture#cancel

例を使用してタスクを試してみて、キャンセルに戻すFutureオブジェクトを使用することができます(SubscriberRunnableであると仮定):

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.

+0

答えを編集して簡単な例を追加すると便利です。私はドキュメントとgoogleのすべてのものを見つけることができますが、答えは私だけではなく、他の人のためにすぎません。これはいくらか(貴重な)時間を節約することができます。 – maverik

+0

ここでは簡単な例を示します –

+0

ありがとうございます。これは本当に役に立ちます。 – maverik

3

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

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

あなたは公式のAPIの詳細を調べるCAND: それは次のようになり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

関連する問題