なぜキュータsubmitedジョブをキャンセルすることはできませんか?

ゴネン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、プロセッサの現在の使用を生成するだけスケジューラヒントです。この操作は、プラットフォームに依存し、実際に使用すべきではありません。したがって、私は私の答えからそれを削除しました。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=313526&siteId=1