2013-05-02 2 views
1

У меня есть n-число Runnable задач (не вызываемых), которые я выполняю с помощью ExecutorService.Эффективный способ дождаться завершения Runnable задач в ExecutorService

Я хочу дождаться завершения всех задач.

Я не могу использовать invokeAll - потому что он работает для сбора Callables.

Я не могу использовать shutdown()+awaitTermination, потому что awaittermination требует предоставить тайм-аут, но мои задачи могут занять несколько часов.

можно использовать:

ExecutorService.shutdown();    
while (!ExecutorService.isTerminated()) {} 

Но этот цикл будет всегда срабатывает.

Что предлагается в таком сценарии?

ответ

2

Вы можете использовать ExecutorService.awaitTermination(Long.MAX_VALUE, TimeUnit.HOURS);

+0

В моем посте я специально написал, почему я не могу его использовать. – yuris

+0

Правильно, исправлен мой ответ –

+0

В моей версии Java TimeUnit нет ЧАСОВ ИЛИ ДЕНЬ – yuris

4

ExecutorService.awaitTermination() возвращает boolean, который указывает, если исполнитель прекращается или не истечет время ожидания. Вы можете назвать это конечно в цикле:

ExecutorService executor = ...; 

executor.shutdown(); 
while (!executor.awaitTermination(24L, TimeUnit.HOURS)) { 
    System.out.println("Still waiting for the executor to finish"); 
} 

System.out.println("Executor finished"); 
1

Для известного числа задач CountDownLatch просто идеально, но бывают случаи, когда вы не знаете, сколько заданий вы будете иметь, в этом случае я использую Semaphore , Пример:

Semaphore s =new Semaphore(0); 
    while(..){ 
    if (isLastTask){ 
     taskExecutor.execute(new Task(s)); 
    } else 
     taskExecutor.execute(new Task()); 
    } 
    s.acquire(1); 

class Task implement implements Runnable { 
    Semaphore s; 

    public Task(){ 
    this(null); 
    } 

    public Task (Semaphore s){ 
    this.s = s; 
    } 

    public void run(){ 
     ...... 
     if (s != null) 
      s.release(); 
    } 
} 
+0

Цикл while должен быть закрыт перед классом декларация. – KrishPrabakar

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