2011-09-10 21 views
6

主要方法一个子线程开始使用java 1.5执行器服务机制。我如何让主线程等待子线程完成?如何加入使用执行程序服务启动的线程?

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

请不要使用Java的空调风格缩进 - 只是使代码更长 –

回答

9

作为一个经验法则,您不应该直接扩展线程,因为这会导致混淆,因为它在这里。

你的TestThread永远不会启动,所以你不能加入它。它所做的只是作为一个Runnable(这是你应该使用的)。

如果您想等待任务完成。

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

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

BTW:之后的Java 1.4.2来了Java 5.0中,随后的Java 6和Java 7

+0

...那么Java 8。 :) – Campa

+1

PS如果您对返回的值感兴趣,也请注意[Callable](http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Callable.html)接口一个任务。 – Campa

+0

@Campa和Java 9 EA。 Java 8的公开更新是2017年3月。 –

相关问题