ホームページ  >  記事  >  Java  >  Java で実行中のスレッドを中断する方法(2)

Java で実行中のスレッドを中断する方法(2)

黄舟
黄舟オリジナル
2016-12-30 13:20:551502ブラウズ

スレッドを中断するには Thread.interrupt() を使用します

リスト A で説明したように、Thread.interrupt() メソッドは実行中のスレッドを中断しません。このメソッドが実際に行うことは、スレッドがブロックされたときに割り込みシグナルをスローして、スレッドがブロック状態を終了できるようにすることです。より正確には、スレッドが Object.wait、Thread.join、Thread.sleep の 3 つのメソッドのいずれかによってブロックされた場合、割り込み例外 (InterruptedException) を受け取るため、ブロック状態が早期に終了します。

したがって、スレッドが上記のメソッドによってブロックされた場合、スレッドを停止する正しい方法は、共有変数を設定して、interrupt() を呼び出すことです (変数を最初に設定する必要があることに注意してください)。スレッドがブロックされていない場合、interrupt() を呼び出しても効果はありません。そうでない場合、スレッドは例外を取得し (スレッドはこの状況を事前に処理できるように準備する必要があります)、ブロックされた状態から抜け出します。どちらの場合も、最終的にスレッドは共有変数をチェックして停止します。リスト C は、この手法を説明する例です。

Listing C
class Example3 extends Thread {
  volatile boolean stop = false;
  public static void main( String args[] ) throws Exception {
   Example3 thread = new Example3();
   System.out.println( "Starting thread..." );
   thread.start();
   Thread.sleep( 3000 );
   System.out.println( "Asking thread to stop..." );
   thread.stop = true;//如果线程阻塞,将不会检查此变量
   thread.interrupt();
   Thread.sleep( 3000 );
   System.out.println( "Stopping application..." );
   //System.exit( 0 );
  }
  public void run() {
    while ( !stop ) {
     System.out.println( "Thread running..." );
      try {
      Thread.sleep( 1000 );
      } catch ( InterruptedException e ) {
      System.out.println( "Thread interrupted..." );
      }
    }
   System.out.println( "Thread exiting under request..." );
  }
}

リスト C の Thread.interrupt() が呼び出されると、スレッドは例外を受け取り、ブロック状態を抜け出し、停止する必要があると判断します。上記のコードを実行すると、次の出力が得られます:

Starting thread...
Thread running...
Thread running...
Thread running...
Asking thread to stop...
Thread interrupted...
Thread exiting under request...
Stopping application...

上記は、Java で実行中のスレッドを中断する方法 (2) の内容です。さらに関連する内容については、PHP 中国語 Web サイト (www.php.cn) に注目してください。 )!


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。