我正在使用 Executors.newFixedThreadPool(100) 方法。单个命令执行需要大约 20 个线程。执行命令 5-6 次后,应用程序停止响应。我的线程正在实现 Callable。
我怀疑,该线程在完成后不会终止。我还调用了 shutdown() 来终止线程。
谁能告诉我,当我使用 get() 方法来检索线程的结果时,它是被终止(意味着它从队列中删除)还是它仍然存在于队列中,池用于存储线程。
线程不会终止。会发生什么:
Callable
所以要么结果队列溢出,要么你Callable
没有返回。
即使在调用 get() 之后,线程仍会在队列中。事实上,API 确保即使一个线程死亡,它也会重新创建一个以保持“固定性”(固定池中的线程数)
请注意,如果池中的线程实际上正在执行某些任务(除了等待),则调用 shutdown 不会终止线程。因此,例如,如果您的线程处于无限循环中做某事,那么调用 shutdown 是没有用的。
get()
是一个阻塞调用 - 这意味着调用线程暂停,直到正在运行的线程完成其任务并且结果可用。
Executor 负责从队列中取出任务并进行清理,所以答案是“不”——它不是“仍在队列中”
小心使用 100 个线程 - 这是一个高得离谱的数字。对于典型的机器尝试 2 到 8 之间(这完全取决于等待其他事情(例如 I/O)所花费的时间 - 您的任务受 CPU 限制越多,您应该使用的线程越少。
调用 shutdown() 只会停止线程池接受新任务,并在所有任务执行完毕后允许所有线程完成。
你有几个核心?如果你有 100 个繁忙的线程,并且说每个线程有 4 个核心,那么每个线程只会获得少量的 CPU 时间。