Java线程生命周期
Java executor有一个线程池。如果我有固定长度的游泳池(例如8)。若应用程序不终止,这8个线程是否都将永远存在?如果代码的某些部分抛出异常,池中的线程是否会死机Java线程生命周期,java,multithreading,Java,Multithreading,Java executor有一个线程池。如果我有固定长度的游泳池(例如8)。若应用程序不终止,这8个线程是否都将永远存在?如果代码的某些部分抛出异常,池中的线程是否会死机 另一方面,如果我想终止线程,如何终止线程?是的,只要ExecutorService存在,它们就会永远存在。您可以通过调用ExecutorService.shutdown()关闭它们。至于你问题的另一部分,报告解释了这一切: 如果任何线程在关机之前的执行过程中由于故障而终止,那么如果需要执行后续任务,将使用一个新线程代替它 是的
另一方面,如果我想终止线程,如何终止线程?是的,只要
ExecutorService
存在,它们就会永远存在。您可以通过调用ExecutorService.shutdown()
关闭它们。至于你问题的另一部分,报告解释了这一切:
如果任何线程在关机之前的执行过程中由于故障而终止,那么如果需要执行后续任务,将使用一个新线程代替它
是的,只要
ExecutorService
存在,它们就会永远存在。您可以通过调用ExecutorService.shutdown()
关闭它们。至于你问题的另一部分,报告解释了这一切:
如果任何线程在关机之前的执行过程中由于故障而终止,那么如果需要执行后续任务,将使用一个新线程代替它
简而言之,线程有以下生命周期阶段:
Thread=新线程()代码>-已创建线程。它还没有运行
myThread.start()
-现在启动线程并执行其run()
方法李>
run()
方法终止时,线程退出。线程一旦终止,就不能再次启动李>
简单线程池通常通过在其
run()
中执行方法wait()
来启动N个正在等待任务的线程。当任务被提交时,线程池的调度程序将其交给其中一个线程,方法是将其分配给线程,并调用线程的notify()
,从而退出wait()
,线程开始执行任务。一旦完成,线程将返回等待状态。简而言之,线程有以下生命周期阶段:
Thread=新线程()代码>-已创建线程。它还没有运行
myThread.start()
-现在启动线程并执行其run()
方法李>
run()
方法终止时,线程退出。线程一旦终止,就不能再次启动李>
简单线程池通常通过在其
run()
中执行方法wait()
来启动N个正在等待任务的线程。当任务被提交时,线程池的调度程序将其交给其中一个线程,方法是将其分配给线程,并调用线程的notify()
,从而退出wait()
,线程开始执行任务。一旦完成,线程将返回等待状态。查询1:
如果我有固定长度的游泳池(例如8)。若应用程序不终止,这8个线程是否都将永远存在?如果代码的某些部分抛出异常,池中的线程是否会死机
我假设您谈论的是固定线程池。请参阅执行器中的API:
public static ExecutorService newFixedThreadPool(int nThreads)
创建一个线程池,该线程池重用在共享无界队列上运行的固定数量的线程。在任何时候,最多N个线程将是活动的处理任务。如果在所有线程都处于活动状态时提交其他任务,它们将在队列中等待,直到有线程可用
如果任何线程在关机前的执行过程中由于故障而终止,则在需要执行后续任务时,将有一个新线程取代它。
池中的线程将一直存在,直到它显式关闭。
查询2:
如果我想终止线程,如何终止线程
查看相关SE问题:
查询1: 如果我有固定长度的游泳池(例如8)。若应用程序不终止,这8个线程是否都将永远存在?如果代码的某些部分抛出异常,池中的线程是否会死机 我假设您谈论的是固定线程池。请参阅执行器中的API:
public static ExecutorService newFixedThreadPool(int nThreads)
创建一个线程池,该线程池重用在共享无界队列上运行的固定数量的线程。在任何时候,最多N个线程将是活动的处理任务。如果在所有线程都处于活动状态时提交其他任务,它们将在队列中等待,直到有线程可用
如果任何线程在关机前的执行过程中由于故障而终止,则在需要执行后续任务时,将有一个新线程取代它。
池中的线程将一直存在,直到它显式关闭。
查询2:
如果我想终止线程,如何终止线程
查看相关SE问题:
执行器/线程池的想法不是为了不担心这些事情,让lib处理棘手的部分吗?:)@有时,最好控制应用程序使用的线程数。过多的线程,尤其是未使用的线程,是毫无意义的,是对资源的浪费。@AdamDyga是的,当然。然而,在提供的上下文中,我们猜测OP为什么要这样做。如果他/她不必要地担心一些事情:将池的线程数保持在8是lib的责任(正如您在下面指出的:)@akadiot对,我的意思是通过保持或关闭整个
ExcecutorService
来控制线程数。但这超出了这个问题的范围好吧,我会给出更多的解释。我有一个共享的用户ID池。我希望线程在其范围内访问它。所以我给每个线程分配了一个id,然后每个线程根据它的线程id在useridpool中操作它自己的范围,因为userid对于每个用户都是唯一的。我需要知道什么时候发生