Java 执行器线程未终止

Java 执行器线程未终止,java,executors,Java,Executors,我正在使用Executors.newFixedThreadPool(100)方法。 单个命令执行需要大约20个线程。执行命令5-6次后,应用程序停止响应。 我的线程正在实现可调用 我怀疑,该线程在完成后不会终止。 我还调用了shutdown()来终止线程 有人能告诉我,当我使用get()方法检索线程的结果时,它是被终止(意味着它从队列中删除)还是仍然在队列中,池使用它来存储线程 即使在调用get()之后,线程仍将在队列中。事实上,API确保即使一个线程死亡,它也会重新创建一个线程以保持“固定性”

我正在使用Executors.newFixedThreadPool(100)方法。 单个命令执行需要大约20个线程。执行命令5-6次后,应用程序停止响应。 我的线程正在实现可调用

我怀疑,该线程在完成后不会终止。 我还调用了shutdown()来终止线程

有人能告诉我,当我使用get()方法检索线程的结果时,它是被终止(意味着它从队列中删除)还是仍然在队列中,池使用它来存储线程

  • 即使在调用get()之后,线程仍将在队列中。事实上,API确保即使一个线程死亡,它也会重新创建一个线程以保持“固定性”(池中线程的固定数量)

  • 请注意,如果池中的线程实际上正在执行某些任务(除了等待),则调用shutdown不会终止线程。例如,如果你的线程在一个无限循环中做一些事情,那么调用shutdown是没有用的

  • 即使在调用get()之后,线程仍将在队列中。事实上,API确保即使一个线程死亡,它也会重新创建一个线程以保持“固定性”(池中线程的固定数量)

  • 请注意,如果池中的线程实际上正在执行某些任务(除了等待),则调用shutdown不会终止线程。例如,如果你的线程在一个无限循环中做一些事情,那么调用shutdown是没有用的

  • get()
    是一个阻塞调用-这意味着调用线程将暂停,直到正在运行的线程完成其任务并且结果可用

    执行者负责从队列中提取任务并进行清理,因此答案是“否”-它不是“仍在队列中”

    注意使用100个线程-这是一个荒谬的高数字。对于一台典型的机器,尝试在2到8之间进行操作(这取决于等待其他事情(如I/O)所花费的时间-任务占用的CPU越多,应该使用的线程就越少。

    get()
    是一个阻塞调用-这意味着调用线程将暂停,直到运行的线程完成其任务并且结果可用为止

    执行者负责从队列中提取任务并进行清理,因此答案是“否”-它不是“仍在队列中”

    注意使用100个线程-这是一个荒谬的数字。对于一台典型的机器,尝试使用2到8个线程(这取决于等待其他事情(如I/O)的时间-任务占用的CPU越多,应该使用的线程就越少。

    调用shutdown()仅停止线程池接受新任务,并允许所有线程在执行完所有任务后完成

    您有多少个内核?如果您有100个繁忙线程,并且假设每个线程有4个内核,那么每个线程只会获得少量的CPU时间。

    调用shutdown()只会停止线程池接受新任务,并允许所有线程在执行完所有任务后完成


    您有多少个内核?如果您有100个繁忙线程,并且假设每个线程有4个内核,那么只会获得少量CPU时间。

    线程不会终止。发生的情况是:

    • 所有工作线程都等待输入队列
    • 一个线程从队列中弹出head元素
    • 它运行可调用的
    • 它将结果推送到结果队列中
    • 它等待输入队列中的新元素

    因此,要么结果队列溢出,要么您的
    可调用的
    不会返回。

    线程不会终止。发生的情况是:

    • 所有工作线程都等待输入队列
    • 一个线程从队列中弹出head元素
    • 它运行可调用的
    • 它将结果推送到结果队列中
    • 它等待输入队列中的新元素

    因此,要么结果队列溢出,要么您的
    可调用的
    无法返回。

    感谢您的回复。我更关心的是,当我调用get()并从该调用中获得结果时,线程是否已从队列中移除,或者它仍在队列中占用空间。感谢您的回复。我更关心的是,当我调用get()时我从那个次调用中得到的结果是,线程是否已从队列中移除,或者它仍然占用队列中的空间。