2011-09-10 11 views
6

W głównej metodzie wątek potomny zostaje uruchomiony przy użyciu mechanizmu obsługi executora java 1.5. Jak sprawić, aby główny wątek czekał na ukończenie wątku podrzędnego?Jak dołączyć do wątku, który został uruchomiony przy użyciu usługi executora?

public class MainClass { 

    public static void main(String[] args) { 
     ExecutorService executorService=null; 
     try { 
      executorService=Executors.newFixedThreadPool(1); 
      executorService.execute(new TestThread()); 
      System.out.println("Main program exited..."); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } finally { 
      executorService.shutdown(); 
     } 
    } 
} 

public class TestThread extends Thread { 

    public TestThread() { 
    } 

    public void run() { 
     try { 
      for (int i=0;i<10;i++) { 
       System.out.println(i); 
       TimeUnit.SECONDS.sleep(5); 
      } 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 
} 
+0

Proszę nie używać klimatyzacji Styl wcięcie na Java - po prostu sprawia, że ​​kod JUŻ –

Odpowiedz

9

Zgodnie z ogólną zasadą nie należy rozszerzać wątku bezpośrednio, ponieważ prowadzi to do zamieszania, tak jak ma to miejsce tutaj.

Twoja funkcja TestThread nigdy się nie rozpoczyna, więc nie możesz się z nią połączyć. Wszystko, co robi, to działanie jako Runnable (którego należy użyć zamiast tego).

Jeśli chcesz poczekać na zakończenie zadania.

Future future = executorService.submit(new TestRunnable()); 

// wait for the task to complete. 
future.get(); 

BTW: Po Java 1.4.2 przyszedł Java 5.0 a następnie Java 6 i Java 7.

+0

... potem Java 8. :) – Campa

+1

PS Mind także interfejs [Callable] (http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Callable.html), jeśli interesuje Cię wartość zwrócona przez zadanie. – Campa

+0

@Campa and Java 9 EA. Java 8 End of Public Updates to marzec 2017. –

Powiązane problemy