Java线程生命周期

Java线程生命周期,java,multithreading,Java,Multithreading,Java executor有一个线程池。如果我有固定长度的游泳池(例如8)。若应用程序不终止,这8个线程是否都将永远存在?如果代码的某些部分抛出异常,池中的线程是否会死机 另一方面,如果我想终止线程,如何终止线程?是的,只要ExecutorService存在,它们就会永远存在。您可以通过调用ExecutorService.shutdown()关闭它们。至于你问题的另一部分,报告解释了这一切: 如果任何线程在关机之前的执行过程中由于故障而终止,那么如果需要执行后续任务,将使用一个新线程代替它 是的

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


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

是的,只要
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对于每个用户都是唯一的。我需要知道什么时候发生