2016-05-22 2 views
-1

Тайм-аут должен произойти через одну секунду, но этого не происходит.Тайм-аут ExecutorService не работает должным образом

public class Worker implements Runnable { 

    int workerId; 

    public Worker(int workerId) { 
     super(); 
     this.workerId = workerId; 
    } 

    public void run() { 
     System.out.println(workerId+"Worker Started ...."); 
     try { 
      Thread.sleep(20000); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
     System.out.println(workerId+"Worker finishes....."); 
    } 
} 

import java.util.concurrent.ExecutorService; 
import java.util.concurrent.Executors; 
import java.util.concurrent.TimeUnit; 

public class TestExecutor { 

    public static void main(String[] args) { 
     ExecutorService executorService=Executors.newCachedThreadPool(); 
     for(int i=0;i<=2;i++){ 
      executorService.submit(new Worker(i)); 
     } 
     executorService.shutdown(); 
     try { 
      executorService.awaitTermination(1, TimeUnit.SECONDS); 
     } catch (InterruptedException e) { 
      System.out.println("Timeout Happen ....."); 
     } 
    } 
} 
+0

Что происходит вместо этого? – Nikem

+0

Что вы ожидаете увидеть в 'executorService.awaitTermination (1, TimeUnit.SECONDS);'? В какой части документации вы думаете, что этот код должен вести себя так, как вы ожидали? – Pshemo

ответ

0

Этот код

try { 
    executorService.awaitTermination(1, TimeUnit.SECONDS); 
} catch (InterruptedException e) { 
    System.out.println("Timeout Happen ....."); 
} 

не делать то, что вы ожидаете, что делать.

Броски: InterruptedException - если прервано во время ожидания

из javadocs. Ваш код не будет завершен в течение второго, и InterruptedException будет выброшен только в том случае, если поток был прерван, а код ожидает завершения функции executorService. Правильный ждать, чтобы проверить, является ли executorService фактически прекращено бы

try { 
    if(executorService.awaitTermination(1, TimeUnit.SECONDS)) 
     System.out.println("Terminated correctly"); 
    else 
     System.out.println("Termination failed"); 
} catch (InterruptedException e) { 
    e.printStackTrace(); 
} 

И executorService.shutdown() ожидает для запуска потоков для оканчиваются. Таким образом, ваш код будет ждать все 20 секунд, пока представленная runnable не завершится и не примет или не начнет новый Runnables тем временем. Если вы хотите закончить Thread менее грациозным способом, вам нужно будет использовать executorService.shutdownNow(), который прервет выполнение потоков.

+0

Я согласен с ответом, но как бы прервать текущий поток – CoreThought

+0

'executorService.shutdownNow()' делает это. Это не позволяет службе принимать какие-либо дополнительные runnables и обычно прерывает все запущенные Threrads. – Paul

+0

Вам следует попробовать shutdownNow(). Это предотвращает запуск задач ожидания и пытается остановить выполнение задач в настоящий момент. –

Смежные вопросы