7

ファイルの読み取り、データベースへの接続などのローカルタスクをスケジュールするエグゼキューターサービスがいくつかあります。これらのプロセスは大量のログを作成します。これは、同時に実行されている多くのスレッドがあり、独自のものをログに書き込むという事実に基づいています。 .

ここで、ある時点で例外を発生させることができます。これは、すべての例外がキャッチされる main メソッドに到達します。次に、すべてのサービスをシャットダウンし、各タスクをキャンセルして、それ以降のすべてのメッセージがログに記録されないようにします。残念ながら、すべてをシャットダウンした後もメッセージが表示されます... 何かアイデアはありますか?

更新:ここにいくつかのコードがあります

public class Scheduler{

private final ExecutorService service;
private final ConcurrentMap<Object, Future<V>> cache;

...

public void shutDown() {
    service.shutdownNow();
    for (Future task : cache.values())
        task.cancel(true);
}
4

4 に答える 4

10

タスクは、スレッドが中断されたことを検出するポイントに到達するまで実行を続けます。これは、一部のシステムまたはスレッド関数を呼び出すときに発生する可能性があり、例外がスローされる場合があります。あなたの場合、おそらく電話して自分自身をチェックする必要があります

Thread.currentThread().isInterrupted()

コードがループを実行し、この方法で停止することが予想される場合は、これを行うことをお勧めします。

于 2012-11-30T10:11:27.487 に答える
7

shutdownNowエグゼキューターまたは呼び出しを行うとcancel(true)(ちなみにshutdownNow、既に送信されたタスクは既にキャンセルされているため、ループは不要です)、タスクが中断されます。

中断にどのように反応するかに応じて、次のようになる可能性があります。

  • 彼らがしていることをすぐにやめなさい
  • 中断信号が定期的に十分にチェックされていないため、しばらくしてから作業を停止します
  • 中断信号が無視されたので、彼らがしていることを続けます

たとえば、タスクがwhile(true)ループを実行する場合、次のように置き換えることができます。

while(!Thread.currentThread().isInterrupted()) {
    //your code here
}
cleanup();
//and exit

もう一つの例:

for (int i = 0; i < aBigNumber; i++) {
    if (Thread.currentThread().isInterrupted()) { break; }
    //rest of the code for the loop
}
cleanup();
//and exit

別の例として、InterruptedException をスローするメソッドを呼び出した場合:

try {
    Thread.sleep(forever); //or some blocking IO or file reading...
} catch (InterruptedException e) {
    cleanup();
    Thread.currentThread.interrupt();
    //and exit
}
于 2012-11-30T10:05:43.687 に答える
4

Executor はシャットダウンの 2 つのアプローチをサポートします

shutdown() : 以前に送信されたタスクが実行される規則正しいシャットダウンを開始しますが、新しいタスクは受け入れられません。すでにシャットダウンされている場合、呼び出しによる追加の効果はありません。

shutdownNow() : アクティブに実行中のすべてのタスクの停止を試み、待機中のタスクの処理を停止し、実行を待機していたタスクのリストを返します。アクティブに実行中のタスクの処理を停止するための最善の努力以外の保証はありません。

参照: http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/ExecutorService.html#shutdownNow ()

于 2012-11-30T09:59:52.557 に答える
0

-メソッドを使用してみてください。shutdowNow()この Executor スローによって開始されたすべてのタスクをシャットダウンしますが、InterruptedException中断IOするSynchronized operation ことはできません。

例えば:

ExecutorService executor = Executors.newFixedThreadPool();

executor.execute();

...
...

executor.shutdownNow();

- cancel(true) method を method とともに使用して、特定のタスクsubmit()シャットダウンできます。

于 2012-11-30T09:59:12.217 に答える