java触发一个系统。线程完成后退出()
我用一个main方法从一个类中启动多个线程
public static void main(String[] args) {
for (int i = 0; i <= ALimit - 1; i++) {
MyThreadImplementsRunnable myThreadImplementsRunnable= new MyThreadImplementsRunnable();
Thread myThread= new Thread(myThreadImplementsRunnable);
myThread.start();
}
}
线程完成工作后,主线程仍在运行。如果我呼叫一个系统。退出(0)在for循环之后,我的线程将不会完成它们的执行,事实上,它们甚至不会启动。 有没有办法触发一个系统。在所有线程完成执行后退出(0),而不对每个线程调用join()方法? 谢谢你的帮助
# 1 楼答案
使用ExecutorService和线程池。别忘了把它关掉。请参见此处的示例 https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ExecutorService.html
例如
一旦所有你的线程都完成了,你的主方法就完成了,执行也就完成了
# 2 楼答案
有很多方法可以做到这一点
1。加入所有生成的线程。(哦,对了,你不想要这个,跳到2)
这意味着保留对所有这些线程的引用:
2。使用倒计时闩锁:
一个
CountDownLatch
基本上是一个倒计时,线程可以等待倒计时达到0。因此,如果每个线程完成倒计时,则主线程可以等待03。使用执行器服务并关闭:
一个
ExecutorService
为您管理线程,您可以执行任务,然后简单地等待ExecutorService
终止4。使用ExecutorService和futures(这实际上就像再次加入所有线程,因此您可能希望跳过此步骤):
一个
ExecutorService
为您管理线程,您可以提交任务,跟踪返回的Future
,然后简单地等待每个Future
的结果到达这方面的一个变体是将
ExecutorService
包装在CompletionService
中,它将按完成的顺序返回Future
:5。使用CompletableFutures
Java8为我们带来了
CompletableFuture
,它允许我们将正在运行的任务用作构建块。我们可以简单地构建一个CompletableFuture
表示所有异步任务结论
CountDownLatch
可能是您想要的,它很简单,而且开销最小ExecutorService
是专业人士会使用的,它明确区分了线程和任务的概念,提供了使用Future
的选项,您可以取消该选项,并为单个任务提供异常处理。线程可以重用,线程的数量可以定制,与任务的数量无关。但这一切可能都是过火了CompletionService
非常适合于您需要在找到任务后立即完成任务的情况CompletableFuture
提供了CountDownLatch
的简单性,但是线程是为您管理的