1

Java 执行器有一个线程池。如果我有固定长度的池(例如 8 个)。如果应用程序不终止,这 8 个线程是否会永远存在?如果部分代码抛出异常,池中的线程会死吗?

另一方面,如果我想终止线程,如何终止线程?

4

3 回答 3

4

是的,只要ExecutorService存在,他们就会永远活着。您可以通过调用来关闭它们ExecutorService.shutdown()。至于你问题的另一部分,javadoc解释了这一切:

如果任何线程在关闭之前的执行过程中由于失败而终止,如果需要执行后续任务,新的线程将取代它。

于 2013-02-06T08:21:54.030 回答
4

简而言之,线程具有以下生命周期阶段:

  1. Thread myThread = new Thread();- 创建线程。它还没有运行。
  2. myThread.start()- 现在线程已启动并run()执行其方法。
  3. run()方法终止时,线程退出。一旦线程终止,它就不能再次启动。

简单线程池通常会启动 N 个线程,这些线程通过wait()在其run(). 提交任务时,线程池的调度程序通过将其入队并调用线程的方式将其提供给其中一个线程,notify()以便wait()退出并开始执行任务。完成后,线程返回等待状态。

于 2013-02-06T08:28:35.113 回答
0

查询一:

如果我有固定长度的池(例如 8 个)。如果应用程序不终止,这 8 个线程是否会永远存在?如果部分代码抛出异常,池中的线程会死吗?

我假设您在谈论固定线程池。请参阅以下中的newFixedThreadPool API Executors

 public static ExecutorService newFixedThreadPool(int nThreads)

创建一个线程池,该线程池重用在共享无界队列上运行的固定数量的线程。在任何时候,最多 nThreads 个线程将是活动的处理任务。如果在所有线程都处于活动状态时提交了其他任务,它们将在队列中等待,直到有线程可用。

如果任何线程在关闭之前的执行过程中由于失败而终止,如果需要执行后续任务,新的线程将取代它。

池中的线程将一直存在,直到显式关闭。

查询 2:

如果我想终止线程,如何终止线程?

看看相关的 SE 问题:

ExecutorService 的 shutdown() 不会等到所有线程都完成

于 2016-05-13T12:54:55.617 回答