一定時間後にスレッドを中断したい。他の誰かが同じ質問をし、トップ投票の回答 ( https://stackoverflow.com/a/2275596/1310503 ) が以下の解決策を提供しました。
import java.util.Arrays;
import java.util.concurrent.*;
public class Test {
public static void main(String[] args) throws Exception {
ExecutorService executor = Executors.newSingleThreadExecutor();
executor.invokeAll(Arrays.asList(new Task()), 2, TimeUnit.SECONDS);
executor.shutdown();
}
}
class Task implements Callable<String> {
public String call() throws Exception {
try {
System.out.println("Started..");
Thread.sleep(4000); // Just to demo a long running task of 4 seconds.
System.out.println("Finished!");
} catch (InterruptedException e) {
System.out.println("Terminated!");
}
return null;
}
}
彼らは次のように付け加えました。
sleep() は必要ありません。SSCCE/デモンストレーション目的でのみ使用されます。sleep()の代わりに、長時間実行されるタスクをすぐに実行してください。
ただし、空のループは InterruptedException をスローしないため、次のように置き換えるThread.sleep(4000);
とコンパイルされません。for (int i = 0; i < 5E8; i++) {}
また、スレッドを割り込み可能にするには、InterruptedException をスローする必要があります。
代わりに、一般的な長時間実行タスクで上記のコードを機能させる方法はありますsleep()
か?