2

私はこのコードを持っています:

public class ThreadInteraction {
       public static void main(String[] argv) {
        System.out.println("Create and start a thread t1, then going to sleep...");
        Thread1 t1 = new Thread1();
        t1.start();


        try{
            Thread.sleep(1000);
        }
        catch(InterruptedException e) {
            System.out.println(e.toString());
        }

            //let's interrupt t1
            System.out.println("----------- Interrupt t1");
        t1.interrupt();

        for(int i =0; i<100; i++)
            System.out.println("Main is back");
     }
}

class Thread1 extends Thread {
      public void run() {
         for(int i =0; i<10000; i++)
              System.out.println(i + "thread1");
      }
 }

t1.interrupt()私の出力ではすべての 10000 t1 print が表示されるため、機能しないようです。私は何か間違ったことをしていますか?

4

2 に答える 2

5

Thread.interrupt()実際には何も停止しません。このメソッドは、スレッドの中断状態を設定することのみを目的としていますが、確認する必要があります。コードを機能させるには、次のようにコードを編成する必要があります。

public void run() {
    for (int i = 0; i < 10000; i++) {
        if (interrupted()) break;
        System.out.println(i + "thread1");
    }
}

Thread.interrupted()ここで中断状態をクリアします。スレッドを直接制御しているので問題ありません。たとえば、 がjava.util.concurrent. Callableスレッド プールのスレッドの 1 つで実行されているなどの割り込みを検出しようとする場合はThread.currentThread().isInterrupted();、スレッドの割り込みポリシーがわからないため、使用することをお勧めします。

于 2012-04-22T09:42:41.820 に答える
1

Thread.interrupt非常に特定の状態にある場合にのみ、ターゲット スレッドを停止させます。

最初に、このスレッドの checkAccess メソッドが呼び出されます。これにより、SecurityException がスローされる可能性があります。

このスレッドが Object クラスの wait()、wait(long)、または wait(long, int) メソッド、または join()、join(long)、join(long, int) の呼び出しでブロックされている場合、sleep(long)、または sleep(long, int)、このクラスのメソッドの場合、その割り込みステータスはクリアされ、InterruptedException を受け取ります。

このスレッドが割り込み可能なチャネルでの I/O 操作でブロックされた場合、チャネルは閉じられ、スレッドの割り込みステータスが設定され、スレッドは ClosedByInterruptException を受け取ります。

このスレッドがセレクターでブロックされている場合、スレッドの割り込みステータスが設定され、セレクターのウェイクアップ メソッドが呼び出されたかのように、スレッドは選択操作からすぐに戻ります。おそらくゼロ以外の値になります。

前の条件のいずれも保持されない場合、このスレッドの割り込みステータスが設定されます。

isInterruptedそのループを早期に終了させたい場合は、スレッドをチェックインする必要があります。

for(int i =0; i<10000 && !isInterrupted(); i++)
于 2012-04-22T09:42:17.187 に答える