2017-08-26 4 views

答えて

3

いくつかの例があります。ほとんどの場合、スレッドをシャットダウンする意図があります。 にスレッドdocumentation of Thread#interrupt)を割り込ませたい場合に必要です。


一つの例は、例外は、定期的に実行から何らかの異常を発生することができました。あなたはすぐにスレッドを聞きたいとは、新しい状況を処理する

スレッドをシャットダウンする場合。次に、割り込みを使用して、スレッドがシャットダウンコールに反応し、数秒間スリープ状態にならないようにすることができます。

または、約10分かかるプログラムをインストールするアプリケーションを想像してください。インストールプロセスを中止するキャンセルボタンが必要な場合があります。そのボタンに割り当てられたメソッドは、フードの下でinterruptを使用して、プロセスが時間内に確実にキャンセルされるようにすることができます。


我々はその後、ダウンそれを破る場合に設定して確認することができ、その普通のフラグThread#interruptで設定し、Thread#isInterruptedで確認してください。

このフラグを既に使用しているJavaライブラリには、Thread#sleepなどの複数のメソッドがあり、スリープ中にフラグが設定されていた場合はInterruptedExceptionがスローされます。

public class Waiter extends Thread { 
    private volatile boolean mShouldStop = false; 

    @Override 
    public void run() { 
     while (!this.mShouldStop) { 
      System.out.println("Still there!"); 

      try { 
       // Sleep for 10 seconds 
       Thread.sleep(10_000); 
      } catch (final InterruptedException e) { 
       // Abort sleeping, got interrupted. 
      } 
     } 

     System.out.println("Shutting down!"); 
    } 

    public void shutdown() { 
     this.mShouldStop = true; 
    } 
} 

と使用方法:終了後にシャットダウンコールのみに反応するスレッドを中断することなく

public class Demo { 
    public static void main(final String[] args) throws InterruptedException { 
     // Create and start the thread 
     final Waiter waiter = new Waiter(); 
     System.out.println("Start"); 
     waiter.start(); 

     // Wait some seconds 
     Thread.sleep(25_000); 

     // Stop the thread, use interrupt to wake it up in case it slept 
     System.out.println("Kindly ask for shutdown"); 
     waiter.shutdown(); 

     System.out.println("Interrupt it"); 
     waiter.interrupt(); 
    } 
} 

ここ


は小さな一例として、ショーケースです寝る
なので、さらに5秒必要です。

注:volatileキーワードは、スレッドがオブジェクトを変更した後、すべてのスレッドが更新されたバリアントをフェッチし、古いキャッシュされたバリアントでは動作しないことを保証します。

+1

'mShouldStop'変数は' volatile'として宣言されなければなりません! (それ以上に説得力のある答え、+1。「ハイレベル」のユースケースを追加したい場合があります:計算が実行されていて10分かかる場合があり、GUIにプログレスバーが表示されます。この場合は "Cancel"ボタンを押してください。このボタンは、フードの下で 'interrupt'を呼び出すことで実装できます) – Marco13

+0

良い考えです。 – Zabuza

+0

これは一般的に正しい考えです。しかし、その例は良くありません。 –