Java线程生命周期

时间:2013-02-06 08:16:56

标签: java multithreading

Java executor有一个线程池。如果我有固定的游泳池长度(例如8)。如果应用程序没有终止,这8个线程是否会永远存在?如果代码的某些部分抛出异常,那么池中的线程是否会死?

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

3 个答案:

答案 0 :(得分:4)

是的,只要ExecutorService存在,它们就会永远存在。您可以致电ExecutorService.shutdown()关闭它们。至于问题的其他部分,javadoc解释了所有内容:

  

如果任何线程因关闭前执行期间的故障而终止,则在需要执行后续任务时,新的线程将取代它。

答案 1 :(得分:3)

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

  1. Thread myThread = new Thread(); - 创建线程。它还没有运行。
  2. myThread.start() - 现在启动线程并执行其run()方法。
  3. run()方法终止时,线程退出。线程终止后,无法再次启动。
  4. 简单线程池通常通过将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