2013-12-10 21 views
13

Yeni bir sorum var. Bu kodum var: Tüm iş parçacıklarının tamamlanması için bekleyecektir. "Tüm konular tamamlandı ..." yani ben bitirmek uygulamakla tüm iş parçacıkları için beklemek ana iş parçacığı askıya nasılThread.join() işlevi yöneticinin karşılığı

public class Main 
{ 

    public static void main(String[] args) 
    { 
     // TODO Auto-generated method stub 
     IntHolder aHolder=new IntHolder(); 
     aHolder.number=0; 

     IncrementalRunable A= new IncrementalRunable(1, aHolder); 
     IncrementalRunable B= new IncrementalRunable(2, aHolder); 
     IncrementalRunable C= new IncrementalRunable(3, aHolder); 

     ExecutorService exec = Executors.newFixedThreadPool(3); 
     exec.execute(A); 
     exec.execute(B); 
     exec.execute(C); 
     //Don't know what to do here 

     System.out.println("All threads completed..."); 
    } 
} 

, sonuçta baskılı edilmelidir: Böyle Executors kullanırsanız iş parçacığı yaptın mı?

+0

onay bu: http://stackoverflow.com/questions/3269445/executorservice-how-to-wait-for-all-tasks-to-finish – giorashc

+0

Gelecek aa sahiptir Bu da daha çok tavsiye edilen yoldur bloklama get yöntemi –

cevap

11
executor.shutdown(); 
while (!executor.awaitTermination(24L, TimeUnit.HOURS)) { 
    System.out.println("Not yet. Still waiting for termination"); 
} 

kullanın shutdown() + awaitTermination() kombinasyon.

DÜZENLEME: @Lital ait yorum dayanarak

List<Callable<Object>> calls = new ArrayList<Callable<Object>>(); 
calls.add(Executors.callable(new IncrementalRunable(1, aHolder))); 
calls.add(Executors.callable(new IncrementalRunable(2, aHolder))); 
calls.add(Executors.callable(new IncrementalRunable(3, aHolder))); 

List<Future<Object>> futures = executor.invokeAll(calls); 

NOT: Tüm görevleri tamamlanana kadar invokeAll() (ya başarısız ya da başarılı yürütülmesine tamamlayarak) dönmeyecek .

+1

Basit bir katılım için sadece bir iş parçacığı havuzu kapatmak için iyi bir uygulama değil mi? – Lital

+1

@Lital Takip edebileceğiniz başka bir şık yaklaşım ekledim. –

+0

@NarendraPathai, harika, bu daha da iyisi, ama sayıları 1,2,3 olarak değiştirin (bunlar mesaj yazdırmak için kullandığım iş parçacığı numaralarıdır) –

0
exec.shutdown(); 
    // Wait until all threads are finish 
    exec.awaitTermination(); 
12

Görevlerin tamamlanması için beklemek istiyorsanız, bu şekilde yürütücüyü kullanmamalısınız. İş parçacığı havuzu yürütücünüzü istemiyorsanız/kapatamazsanız ne olur?

ExecutorService exec = Executors.newFixedThreadPool(3); 
    Collection<Future<?>> tasks = new LinkedList<Future<?>>(); 

    Future<T> future = exec.submit(A); 
    tasks.add(future); 
    future = exec.submit(B); 
    tasks.add(future); 
    future = exec.submit(C); 
    tasks.add(future); 

    // wait for tasks completion 
    for (Future<?> currTask : tasks) { 
      try { 
       currTask.get(); 
      } catch (Throwable thrown) { 
       Logger.error(thrown, "Error while waiting for thread completion"); 
      } 
     } 
+0

Bu gibi uygulayıcıları kullanmamam gerektiği konusunda hemfikirim ama şimdi java ile dalga geçiyorum ve bunu nasıl başarabileceğimi merak ettim –

İlgili konular