1

遅延を使用して同じループで異なるメソッドを呼び出すにはどうすればよいですか?

time 0: call A  
+100ms: call B  
+100ms: call C  
+100ms: call D  
...  
+100ms: call X  
stopLoop()  

私は試した:

    Thread thread = new Thread() {
                @Override
                public void run() {
                    try {
                        while (true) {
                            call A();
                            sleep(100);
                            call B();
                            sleep(100);
                            call C();
                            sleep(100);
                            call D();
                            sleep(100);
                            call E();
                            sleep(100);

                            thread.stop(); ???
                        }
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            };
            thread.start();

stop() 以外は機能していますが、同じスレッド内からスレッドを強制終了することは論理的に見えません。

4

1 に答える 1

2

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 を受け取ります。

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

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

生きていないスレッドを中断しても、何の効果もありません。

Thread.stop、Thread.suspend、Thread.resume、および Runtime.runFinalizersOnExit が非推奨になったのはなぜですか?

次のようなことを試してください:

while (!Thread.currentThread().isInterrupted()) {
    //Call methods .
    Thread.currentThread().interrupt();
}
于 2013-03-30T15:34:23.487 に答える