0

http://www.ibm.com/developerworks/java/library/j-jtp05236/index.htmlを読みました

私は自分のロックをキャンセルできないタスクにすることにしました

try {
    lockedRecords.wait();
} catch (InterruptedException e) {
    interrupted = true;
}

しかし、する必要があります

} finally {
    if (interrupted) {
        Thread.currentThread().interrupt();
    }
}

この記事では、割り込みステータスを保持するには、interrupt()を呼び出す必要があると述べています。まだ非常にぼやけているので、.interruptを設定するとどうなりますか?次は何が起こる?これで少し失われました..入力はありますか?

それは私のプログラムにどのような価値をもたらしますか?素人の言葉で親切に説明してください、大いに感謝します:D

4

2 に答える 2

2

ここで重要なのは、例で記述されていないコードです。例(getNextTask)のメソッドは、次の場所で使用できます。

while (!Thread.interrupted()) {
   Task task = getNextTask(queue);  
   doSomething(task);
}
System.out.println("The thread was interrupted while processing tasks.");
System.out.println("...stopped processing.");

上記のwhileループは、誰かがこのループが実行されているスレッドに割り込まない限り、永久に実行されます。

ただし、のように割り込みステータスがリセットされない場合、スレッドが入ってgetNextTaskいるときに誰かがスレッドに割り込みを試みた場合、割り込みは失われ、上記で記述したコードのビットはループを停止しません。queue.takegetNextTask

IBM Webページの例の要点は、誤ってスレッドを中断できなくなる可能性があるため、割り込みを飲み込むときは十分に注意する必要があるということです。

于 2011-08-09T23:45:00.600 に答える
0

InterruptedExceptionタスクが完了して戻った後に現在のスレッドが終了することがわかっている限り、飲み込むだけで問題ありません。

ExecutorServiceのようなスレッド プールを使用すると、通常、タスクが完了した後もスレッドが実行され続け、次のタスクが来るのを待つときに問題が発生することがあります。この場合、プールされたスレッドが中断されたことを通知して、この状況で適切な処理を実行できるようにする必要があります。たとえば、クリーン シャットダウンを実行して終了します。

したがって、ルーチンから戻る前に、中断された状態を確実に復元することをお勧めします。

于 2011-10-27T14:18:19.373 に答える