有人可以列出Thread Spawning与Thread Pooling之间的一些比较点,哪一个更好?请将.NET框架视为支持两者的参考实现.
Han*_*ant 25
线程池线程比常规线程便宜得多,它们汇集了线程所需的系统资源.但它们有许多限制可能使它们不合适:
后两个约束是线程池调度程序的副作用,它尝试将活动线程数限制为CPU可用的核心数.如果您安排许多经常阻塞的长时间运行线程,这可能会导致长时间延迟.
许多其他线程池实现具有类似的约束,给予或接受.
jld*_*ont 21
"池"包含准备使用的可用"线程"列表,而"产生"是指实际创建新线程.
"线程池"的用处在于"较低的使用时间":避免了创建时间开销.
在"哪一个更好"方面:它取决于.如果创建时间开销是一个问题,请使用Thread-pooling.在需要执行大量"短期任务"的环境中,这是一个常见问题.
正如其他人所指出的,Thread-Pooling存在"管理开销":如果正确实现,这是最小的.例如,限制池中的线程数是微不足道的.
dan*_*ben 10
对于"更好"的某些定义,您通常希望使用线程池.在不知道您的用例是什么的情况下,请考虑使用线程池,您可以在启动时创建固定数量的线程,也可以按需创建(但线程数不能超过池的大小).如果提交了任务并且没有可用的线程,则将其放入队列,直到有一个线程可以自由处理它.
如果您为响应请求或某种其他类型的触发器而生成线程,则存在耗尽所有资源的风险,因为没有任何内容可以限制创建的线程数量.
线程池的另一个好处是重用 - 一遍又一遍地使用相同的线程来处理不同的任务,而不是每次都必须创建一个新的线程.
正如其他人所指出的,如果你有少量任务会运行很长时间,这将抵消避免频繁创建线程所带来的好处(因为你无论如何都不需要创建大量的线程).
一切都取决于你的情况.创建新线程是资源密集型和昂贵的操作.大多数非常短的异步操作(最多不到几秒)都可以使用线程池.
对于要在后台运行的较长时间运行的操作,通常会创建(生成)自己的线程.(Ab)使用平台/运行时内置线程池进行长时间运行可能会导致令人讨厌的死锁形式等.
归档时间: |
|
查看次数: |
27795 次 |
最近记录: |