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){ ... }
答案 0 :(得分:1)
Effective Java建议不要直接使用Thread
,而是使用java.util.concurrent
包中定义的Executor Framework。在此框架中,您将首先从Executors
中的某个静态工厂方法获取ExecutorService
,并通过调用{{1}替换new Thread
和t.start()
然后,在具有CountDownLatch
或其他提供的同步器类的线程之间进行协调,或者(如在您的简单情况下)在submit()
返回get()
上调用Future
。
请注意,submit()
一旦创建,将永久运行,如果您忽略在其上调用ExecutorService
,可能会使您的程序无法终止。它们被设计为可以重复使用,将许多不同的任务提交给单个任务(可以在许多不同的线程内部将它们分开),并且将继续运行,直到你告诉它们不再发生重用。