启动工作线程然后加入它们的正确方法是什么?

时间:2016-02-08 21:11:50

标签: java multithreading

Java教程之一在线程上给出了这个例子。以下代码段来自https://docs.oracle.com/javase/tutorial/essential/concurrency/simple.html。这是我要问的部分(有一些小编辑):

Thread t = new Thread(new MessageLoop());
t.start();

while (t.isAlive()) {
    t.join();
}

主要问题是:当线程实际启动之前t.isAlive()返回false时会发生什么?从我的一些测试开始:

Thread t = new Thread(new Whatever());
t.start();
System.out.println(t.isAlive()+" "+t.getState());

可能t.getState()是NEW而t.isAlive()是false。上面的while循环从未加入我的工作线程,因为isAlive会返回false(即使工作线程甚至没有启动)。除了第一个代码块中显示的内容之外,是否有更好的方法来连接工作线程?我应该检查状态以及它是否还活着?也许是这样的:

while(t.isAlive() || t.getState()==Thread.State.NEW){ ... }

1 个答案:

答案 0 :(得分:1)

Effective Java建议不要直接使用Thread,而是使用java.util.concurrent包中定义的Executor Framework。在此框架中,您将首先从Executors中的某个静态工厂方法获取ExecutorService,并通过调用{{1}替换new Threadt.start()然后,在具有CountDownLatch或其他提供的同步器类的线程之间进行协调,或者(如在您的简单情况下)在submit()返回get()上调用Future

请注意,submit()一旦创建,将永久运行,如果您忽略在其上调用ExecutorService,可能会使您的程序无法终止。它们被设计为可以重复使用,将许多不同的任务提交给单个任务(可以在许多不同的线程内部将它们分开),并且将继续运行,直到你告诉它们不再发生重用。