web-dev-qa-db-ja.com

Javaでスレッドはどのように自身を閉じる必要がありますか?

これは短い質問です。ある時点で、私のスレッドは自殺すべきだと理解しています。それを行う最良の方法は何ですか:

  1. Thread.currentThread()。interrupt();
  2. 戻り;

ところで、最初のケースでcurrentThreadを使用する必要があるのはなぜですか? Threadは現在のスレッドを参照していませんか?

63
Roman

threadを終了する場合は、戻るだけで問題ありません。 Thread.currentThread().interrupt()を呼び出す必要はありません(ただし、何も悪いことはしません。必要ないだけです)。これは、interrupt()が基本的に所有者に通知するために使用されるためです。スレッドの(まあ、100%正確ではなく、ある種の)。あなたはスレッドの所有者であり、スレッドを終了することにしたので、通知する人はいないので、それを呼び出す必要はありません。

ところで、最初のケースでcurrentThreadを使用する必要があるのはなぜですか?スレッドは現在のスレッドを参照していませんか?

はい、そうではありません。私はそれが混乱する可能性があると思いますThread.sleep()は現在のスレッドに影響しますが、Thread.sleep()は静的メソッドです。

あなたがスレッドの所有者ではない場合(例えば、Threadを拡張せず、Runnableなどをコーディングしていない場合)

Thread.currentThread().interrupt();
return;

このようにして、実行可能ファイルを呼び出したコードは、スレッドが中断されていることを認識します=(通常)実行中の処理を停止して終了します。先ほど言ったように、それは単なるコミュニケーションのメカニズムです。所有者は、中断状態を単に無視して何もしないかもしれません。しかし、中断状態を設定した場合、誰かが将来あなたに感謝するかもしれません。

同じ理由で、絶対にしないでください

Catch(InterruptedException ie){
     //ignore
}

なぜなら、あなたはそこでメッセージを止めているからです。代わりに行う必要があります

Catch(InterruptedException ie){
    Thread.currentThread().interrupt();//preserve the message
    return;//Stop doing whatever I am doing and terminate
}
63
Enno Shioji

Runメソッドが終了すると、スレッドは終了します。

ループを使用する場合、適切な方法は次のようなものです。

// In your imlemented Runnable class:
private volatile boolean running = true;

public void run()
{
   while (running)
   {
      ...
   }
}


public void stopRunning()
{
    running = false;
}

もちろん返品が最善の方法です。

18

あなたがスレッドのトップレベルにいる場合-またはきれいにgetをトップレベルに持っている場合-戻るだけでいいです。例外をキャッチしても無視できないことを確認できるようにする必要があるため、例外をスローすることはそれほどきれいではありません。

Thread.currentThread()を呼び出すためにinterrupt()を使用する必要がある理由は、interrupt()がインスタンスメソッドであるためです-割り込みたいスレッドで呼び出す必要があります、あなたの場合はたまたま現在のスレッドです。中断は、スレッドが次にブロックされるときにのみ通知されることに注意してください(例:IOまたはモニターの場合))-例外がすぐにスローされるわけではありません。

5
Jon Skeet

単にinterrupt()を呼び出すと、スレッドは自動的に閉じられません。代わりに、isInterrupted()がそれに応じて実装されている場合、スレッドはcontinue livingでさえあります。 closeを保証する唯一の方法は、OPが要求するとおりです。

_Thread.currentThread().stop();
_

ただし、メソッドは非推奨です。

returnを呼び出すと、現在のメソッドからのみ戻ります。これは、トップレベルにいる場合にのみスレッドを終了します。

それでも、interrupt()を操作して、その周りにコードを構築する必要があります。

5
Blauhirn

スレッドはインスタンスではなくクラスです。 currentThread()は、呼び出し元のスレッドに対応するThreadインスタンスを返す静的メソッドです。

(2)を使用します。 interrupt()は通常の使用には少し残酷です。

1
Marcelo Cantos