首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >执行器线程未终止

执行器线程未终止
EN

Stack Overflow用户
提问于 2011-06-06 21:17:08
回答 4查看 2.7K关注 0票数 0

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

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

谁能告诉我,当我使用get()方法检索线程的结果时,它是被终止了(也就是说,它从队列中删除了)还是仍然在队列中,由池用来存储线程。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-06-06 21:24:20

线程不会终止。事情是这样的:

  • 所有工作线程都在等待输入队列
  • 一个线程从队列中弹出头元素
  • 它运行Callable
  • It将结果推入结果队列
  • 它等待输入队列中的新元素

<>F212>

所以要么结果队列溢出,要么你的Callable不会返回。

票数 3
EN

Stack Overflow用户

发布于 2011-06-06 21:21:51

get

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

  • 注意,如果你的池中的线程真的在做一些任务(除了等待之外),调用shutdown不会终止这个线程。例如,如果你的线程在无限循环中做一些事情,那么调用shutdown是没有用的。
票数 1
EN

Stack Overflow用户

发布于 2011-06-06 21:22:30

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

Executor负责从队列中获取任务并进行清理,所以答案是“不”--它不是“仍然在队列中”

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6252575

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档