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