假设我已将一个工作项排入队列ThreadPool
,但是如果没有要处理的数据(从BlockingQueue
)。如果队列为空并且队列中不再有工作,那么我必须调用Thread.Interrupt
方法,如果我想中断阻塞任务,但是如何用 a 做同样的事情ThreadPool
?
代码可能如下所示:
void Run()
{
try
{
while(true)
{
blockingQueue.Dequeue();
doSomething();
}
}
finally
{
countDownLatch.Signal();
}
}
我知道在这种情况下最好的办法是使用常规的Thread
,但我想知道是否有一个ThreadPool
中断工作项的等效方法。
Which BlockingQueue
就是它?这是BCL课程吗? TPL类?还是定制?
不管;很简单——我不会。你could在线程生命周期的早期做一些事情来存储线程引用,但我根本不会使用ThreadPool
对于这项工作,因为听起来它的运行时间更长。一个常规的Thread
似乎更合适。
我还感到惊讶的是,没有内置方法告诉队列释放所有工作人员 - 我之前编写过阻塞队列,并且我倾向于使用该模式(例如,从这里 https://stackoverflow.com/questions/530211/creating-a-blocking-queuet-in-net/530228#530228):
public bool TryDequeue(out T value) {...}
有了这个:
- 有数据则立即返回true
- 如果没有数据但添加了一些数据,则阻塞并(最终)返回 true
- 如果队列被关闭,则阻塞并(最终)返回 false
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)