Por que não posso cancelar meu executor trabalho submetido?

Gonen I:

Eu estou tentando em vão cancelar uma linha submetido com este código

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

mas as estadias de rosca em execução. Quando o sono é usada em vez de rendimento, o segmento não são cancelados. Por exemplo, este faz cancelar o tópico:

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

O que está acontecendo? Estou faltando alguma coisa na documentação?

Ravindra Ranwala:

Sua primeira tarefa não é sensível a interrupção. Mas a segunda tarefa é sensível porque Thread.sleepé um método de bloqueio que é sensível a interrupção. Uma maneira de resolver o problema é fazendo a sua tarefa sensível a interrupção. Veja como ele se parece.

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

Por outro lado Thread.yieldé apenas uma sugestão escalonador para se obter a sua utilização corrente de um processador. Esta operação é dependente de plataforma e não deve ser usado na prática. Daí eu ter removido-lo de minha resposta.

Acho que você gosta

Origin http://43.154.161.224:23101/article/api/json?id=313525&siteId=1
Recomendado
Clasificación