6

スレッドを中断したいのですが、呼び出しinterrupt()が機能していないようです。以下はサンプルコードです。

public class BasicThreadrRunner {
    public static void main(String[] args) {
        Thread t1 = new Thread(new Basic(), "thread1");
        t1.start();
        Thread t3 = new Thread(new Basic(), "thread3");
        Thread t4 = new Thread(new Basic(), "thread4");
        t3.start();
        t1.interrupt();
        t4.start();
    }
}
class Basic implements Runnable{
    public void run(){
        while(true) {
            System.out.println(Thread.currentThread().getName());
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                System.err.println("thread: " + Thread.currentThread().getName());
                //e.printStackTrace();
            }
        }
    }
}

しかし、出力はスレッド 1 がまだ実行されているように見えます。誰もがこれとどのようにinterrupt()機能するかを説明できますか? ありがとう!

4

2 に答える 2

15

キャッチして実行し続けるという理由だけで、スレッドはまだ実行されてInterruptedExceptionいます。interrupt()は主にThreadオブジェクトにフラグを設定します。フラグは で確認できますisInterrupted()。また、一部のメソッド(特に , )sleep()が. また、一部の I/O 操作がすぐに終了する原因にもなります。ブロックからの出力が表示されている場合は、それが機能していることがわかります。join Object.wait()InterruptedExceptioncatchinterrupt()

于 2011-11-08T12:20:46.357 に答える
14

他の人が言ったように、割り込みをキャッチしますが、何もしません。あなたがする必要があるのは、次のようなロジックを使用して割り込みを伝播することです。

while(!Thread.currentThread().isInterrupted()){
    try{
        // do stuff
    }catch(InterruptedException e){
        Thread.currentThread().interrupt(); // propagate interrupt
    }
}

while(true)単なる遅延コーディングなどのループ ロジックの使用。代わりに、割り込みによる終了を判断するために、スレッドの割り込みフラグをポーリングします。

于 2011-11-08T13:05:53.267 に答える