-1

を使用してスレッドの実行を停止していますThread.interruptが、スレッドの実行が停止しません。まだ実行中です。

例 :

Thread t = new Thread(new Runnable() {

            @Override
            public void run() {
                    int i = 0;
                    while(i<10000){
                        if(Thread.currentThread().isInterrupted()){
                            System.out.println("Thread Interrupted but it still running");
                        }
                        System.out.println(++i);
                        try {
                            Thread.sleep(2);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
            }
        });
        t.start();
        t.interrupt();

Thread.isInterrupted()スレッドが中断されているかどうかを確認できません。ループから抜け出します。私はこれを行うことはできません。ここでは、サンプル例を示しています。

私の疑問は、フラグのみThread.interruptを設定interruptedするか、実際に実行を停止することです。

これに関する助けをいただければ幸いです。

スレッドの実行を停止したり、実行中のスレッドを強制終了したりするにはどうすればよいですか?

4

4 に答える 4

1

Thread.interrupt()は、実際にその状態をチェックする操作(たとえば、割り込み可能なI / O操作、または原則として引用するコードで行うようにisInterrupted()を明示的にチェックするユーザーコード)を真に中断します。

引用する特定の例では、次の点に注意する必要があります。

  • 各プロセッサコアは、1秒あたり数十億の命令で実行されます。
  • プロセスの切り替えは、1秒間に数十から数百回のオーダーで発生します。

言い換えると、カウンターを10,000回デクリメントするタスクは非常に高速に実行されるため、すべての意図と目的に対して、「中断可能なタスク」として登録されることはほとんどありません。実際には、他のスレッドがinterrupt()を呼び出す前に、10,000のデクリメントがすべて発生するか、発生しません。

于 2012-12-10T04:39:17.350 に答える
1

スレッドが待機、スリープ、または参加時にブロックされると、InterruptedExceptionがスローされます。それ以外の場合は、割り込みステータスが設定されます。

Thread.interruptedが呼び出されると、割り込みステータスはクリアされます。

Thread.isInterruptedは、中断されたステータスをクリアしません。

スレッドの割り込みステータスが設定されていて、このスレッドが待機、スリープ、または参加を呼び出すと、割り込みステータスがクリアされ、InterruptedExcepionがスローされます。

于 2012-12-10T04:40:04.747 に答える
0

割り込み可能なステートメント(スリープ、待機など)がその時点で実行されていない限り、フラグを設定するだけです。これで、両方の状況に対処することで、スレッドを停止する方法を理解できるはずです。

Thread.isInterrupted()をチェックできません。スレッドが中断された場合は、ループから抜け出します。私はこれを行うことはできません。

なぜだめですか?

例えば

while(i<10000){
    if(Thread.currentThread().isInterrupted()){
        System.out.println("Thread Interrupted but it still running");
        return;    // HERE
    }
    System.out.println(++i);
    try {
        Thread.sleep(2);
    } catch (InterruptedException e) {
        e.printStackTrace();
        return;    // HERE
    }
}
于 2012-12-10T04:17:01.420 に答える
0

私の疑問は、Thread.interruptが割り込みフラグのみを設定するか、実際に実行を停止することです。

前者を実行します...または特定の状況で「中断された」例外をスローします。

スレッドの実行を停止したり、実行中のスレッドを強制終了したりするにはどうすればよいですか?

一般に、中断されたフラグをチェックしていない実行中のスレッドを安全に停止または強制終了することはできません。クラスには非推奨のメソッドがいくつかありますがThread、明らかに安全ではないため、これらのメソッドの使用は避けてください。(なぜThreadメソッドjavadocs ...とそれがリンクしているFAQを理解するため。)

于 2012-12-10T05:23:17.940 に答える