1

このオラクルのチュートリアルから直接:

割り込み

割り込みは、実行中の処理を停止して別の処理を実行する必要があることをスレッドに示すものです。スレッドが割り込みにどのように応答するかを正確に決定するのはプログラマ次第ですが、スレッドが終了することは非常に一般的です。これは、このレッスンで強調されている使用法です。

「決定するのはプログラマー次第です..」その特定の動作をプログラムすることはどこで可能ですか? 「スレッドが終了することは非常に一般的です」は、標準の動作がスレッドを終了することを意味しますか?

編集: たとえば、 Sempaphore クラスの acquireUninterruptively メソッドがあります。これは、割り込みを受け取った場合、割り込みによって中断された時間の待機時間を遅らせるだけです。おそらくこの場合、割り込み処理は Thread.yield() だけで構成されていますか? 前もって感謝します。

4

3 に答える 3

2

通常はスリープスローのような方法InterruptedExceptionです。

スローするメソッドを呼び出さずにスレッドが長時間経過すると、InterruptedException? 次に、定期的に Thread.interrupted を呼び出す必要があります。これは、割り込みが受信された場合に true を返します。例えば:

for (int i = 0; i < inputs.length; i++) {
    heavyCrunch(inputs[i]);
    if (Thread.interrupted()) {
        // We've been interrupted: no more crunching.
        return;
    }
}

この単純な例では、コードは単純に割り込みをテストし、割り込みが受信された場合はスレッドを終了します。より複雑なアプリケーションでは、InterruptedException をスローする方が理にかなっている場合があります。

if (Thread.interrupted()) {
    throw new InterruptedException();
}

今あなたの質問に答えます:

  1. 上記の例から、メソッドによって処理されない場合、InterruptedException を独自に処理できることがわかります。
  2. これらのメソッドでこれを処理できるため、終了するのではなく、他のタスクを実行できます。しかし、割り込みが発生した後にスレッドを終了するのが最も一般的です。

ソース: javadoc

于 2013-06-01T09:19:11.273 に答える
1

問題があると割り込みが発生し(他のケースも存在します)、プログラムはINTERRUPT SERVICE ROUTINEに切り替わります。そこで問題を処理し、実行を続行するか、解決できない場合は終了します。

Javaでは、「例外」(割り込み)でさえ、通常、そのようなルーチン(割り込みを引き起こす可能性があります)とcatch(Exception)を記述して、それをキャッチして処理します。問題が解決できない場合は、終了します。

于 2013-06-01T09:19:02.373 に答える
0

割り込みを設定すると、フラグが設定されます。これよりも複雑ですが、それが基本的な動作です。を使用して、割り込みを検出するポイントをプログラムします。

if(Thread.currentThread.isInterrupted())

または、基本的にこれを行う関数を使用します。何か魔法のようなことが起こると思い込んではいけません。結局のところ、すべてがコードを使用して実装されます。

于 2013-06-01T09:28:31.247 に答える