Why can't I cancel my executor submited job?

Gonen I :

I'm unsuccessfully trying to cancel a thread submitted with this code

  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();

but the thread stays running. When sleep is used instead of yield, the thread does get cancelled. For example this does cancel the thread:

  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();

What's going on? Am I missing something in the documentation?

Ravindra Ranwala :

Your first task is NOT responsive to interruption. But the second task is responsive because Thread.sleep is a blocking method which is responsive to interruption. One way to solve the issue is by making your task responsive to interruption. Here's how it looks.

Future<?> future = executor.submit(() -> {
    while (!Thread.currentThread().isInterrupted())
        System.out.println("Thread");
});

Moreover Thread.yield is just a scheduler hint to yield its current use of a processor. This operation is platform dependent and should not be used in practice. Hence I have removed it from my answer.

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=306868&siteId=1