ゴネンI:
私は失敗し、このコードで提出スレッドをキャンセルしようとしています
ExecutorService executor = Executors.newSingleThreadExecutor();
Future<Object> future = executor.submit(()-> {while(true) { System.out.println("Thread"); Thread.yield();} } );
Thread.sleep(3000);
future.cancel(true);
executor.shutdown();
しかし、スレッドの滞在が実行されています。睡眠は、代わりに利回りの使用されている場合は、スレッドがキャンセルされますありません。たとえばこれは、スレッドをキャンセルします:
ExecutorService executor = Executors.newSingleThreadExecutor();
Future<Object> future = executor.submit(()-> {while(true) { System.out.println("Thread"); Thread.sleep(1000);} } );
Thread.sleep(3000);
future.cancel(true);
executor.shutdown();
どうしたの?私は、ドキュメントに何かが足りないのですか?
ラビンドラRanwala:
あなたの最初の仕事は中断に応答しません。ので、しかし、2番目のタスクは、応答するThread.sleep
中断に応答するブロッキング方法です。この問題を解決する1つの方法は、中断にあなたのタスクが応答することによってです。ここではそれがどのように見えるのです。
Future<?> future = executor.submit(() -> {
while (!Thread.currentThread().isInterrupted())
System.out.println("Thread");
});
またThread.yield
、プロセッサの現在の使用を生成するだけスケジューラヒントです。この操作は、プラットフォームに依存し、実際に使用すべきではありません。したがって、私は私の答えからそれを削除しました。