java启动工作线程并加入它们的正确方法是什么?
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()是新的,而t.isAlive()是错误的。上面的while循环将永远不会加入我的工作线程,因为isAlive将返回false(即使工作线程甚至没有启动)。除了第一段代码中显示的方法外,还有更好的方法连接工作线程吗?我是不是应该检查一下它的状态以及它是否还活着?也许是这样的:
while(t.isAlive() || t.getState()==Thread.State.NEW){ ... }
# 1 楼答案
有效的Java建议不要直接使用} 中的一个静态工厂方法获取} 或其他提供的同步器类在线程之间进行协调,或者(在简单的情况下)调用
Thread
,而是使用java.util.concurrent
包中定义的Executor框架。在这个框架中,首先从^{ExecutorService
,用对submit()
的调用替换new Thread
和t.start()
,然后用^{submit()
返回的Future
上的get()
请注意
ExecutorService
一旦创建,将永远运行,并且如果忽略对其调用shutdown()
,可能会阻止程序终止。它们被设计为可重用的,将许多不同的任务提交给单个任务(这可能会在内部将它们分割到许多不同的线程中),并将继续运行,直到您告诉它们不再进行重用为止