-4

わかりました、私のクラスの 1 つで、InterruptedException をスローしたいと考えています。私は呼び出すことによってそれを行います

thread.interrupt();

私の知る限り、これは InterruptedException をスローします。私が知りたいのは、スレッドでこの例外をキャッチする方法です。これは明らかにうまくいきません:

public void run() throws InterruptedException // This results in an error

編集: スレッドで try/catch ブロックを使用する場合、スローされると宣言しない場合、どのように中断された例外をキャッチできますか?

4

2 に答える 2

4

を呼び出しthread.interruptても、自動的にInterruptedException. 割り込み状態を定期的に確認する必要があります。例えば:

if(Thread.currentThread().isInterrupted()) {
    throw new InterruptedException(); // or handle here.
}

のようにいくつかのメソッドがこれを行いますThread.sleepが、それ以外の場合は例外はスローされません。

于 2013-01-28T23:31:06.150 に答える
3

直接の質問に答えるには、他の例外と同じようにキャッチします。通常、これは例外をスローするスリープ コマンドに応答して行われます。キャッチした場合は、run ステートメントを超えてスローする必要はありません。たとえば、これは機能するはずです。

void run()
{
    try
    {
        Thread.sleep(500);
    }
    catch (InterruptedException ex)
    {
        //Do stuff here
    }
}

ただし、InterruptedExceptionは、おそらくあなたが考えていることを意味しないのではないかと思います。Thread.sleep() などのメソッドでのみスローされ、thread.interrupt()名前は似ていますが とは関係ありません。別のスレッドからの thread.interrupt() をテストする場合は、次のようにする必要があります。

public void run()
{
  while (true)
  {
    if (Thread.interrupted())  // Clears interrupted status!
    {
        //Stop
        break;
    }
  }
}

指定されたコードは、スレッドが (別のスレッドの呼び出しによって) 中断されるまでスレッドを永久に実行しinterrupt()、そこで停止します。より複雑な例を考えてみてください。

于 2013-01-28T23:19:41.263 に答える