Java executor有一个线程池。如果我有固定的游泳池长度(例如8)。如果应用程序没有终止,这8个线程是否会永远存在?如果代码的某些部分抛出异常,那么池中的线程是否会死?
另一方面,如果我想终止线程,如何终止线程?
答案 0 :(得分:4)
是的,只要ExecutorService
存在,它们就会永远存在。您可以致电ExecutorService.shutdown()
关闭它们。至于问题的其他部分,javadoc解释了所有内容:
如果任何线程因关闭前执行期间的故障而终止,则在需要执行后续任务时,新的线程将取代它。
答案 1 :(得分:3)
简而言之,线程有以下生命周期阶段:
Thread myThread = new Thread();
- 创建线程。它还没有运行。myThread.start()
- 现在启动线程并执行其run()
方法。 run()
方法终止时,线程退出。线程终止后,无法再次启动。 简单线程池通常通过将wait()
方法执行到run()
来启动N个等待任务的线程。当提交任务时,线程池的调度程序通过将它排入并调用线程的notify()
将其提供给其中一个线程,以便wait()
退出并且线程开始执行该任务。完成后,线程返回等待状态。
答案 2 :(得分:0)
查询1:
如果我有固定长度的游泳池(例如8)。如果应用程序没有终止,这8个线程是否会永远存在?如果代码的某些部分抛出异常,那么池中的线程是否会死?
我假设您正在谈论固定线程池。请参阅Executors
中的newFixedThreadPool API:
public static ExecutorService newFixedThreadPool(int nThreads)
创建一个线程池,该线程池重用在共享无界队列中运行的固定数量的线程。在任何时候,最多nThreads线程将是活动的处理任务。如果在所有线程都处于活动状态时提交了其他任务,则它们将在队列中等待,直到线程可用。
如果任何线程因关闭前执行期间的故障而终止,那么如果需要执行后续任务,新的线程将取代它。
池中的线程将一直存在,直到它被明确关闭。
查询2:
如果我想终止线程,如何终止线程?
看看相关的SE问题:
ExecutorService's shutdown() doesn't wait until all threads will be finished