假设我已经在 ThreadPool
中排队了一个工作项,但是如果没有数据要处理(从 BlockingQueue
读取),工作项就会阻塞。如果队列是空的,没有更多的工作进入队列,那么我必须调用Thread.Interrupt
方法来中断阻塞任务,但是如何做同样的事情使用ThreadPool
?
代码可能是这样的:
void Run()
{
try
{
while(true)
{
blockingQueue.Dequeue();
doSomething();
}
}
finally
{
countDownLatch.Signal();
}
}
我知道在这种情况下最好的办法是使用常规的 Thread
,但我想知道是否有 ThreadPool
等效的中断方式一个工作项。
最佳答案
那是哪个 BlockingQueue
?那是BCL课吗? TPL类?还是定制?
没关系;很简单——我不会。您可以在线程生命周期的早期做一些事情来存储线程引用,但我根本不会将 ThreadPool
用于这项工作,因为它听起来运行时间更长。常规的 Thread
似乎更合适。
我也很惊讶没有告诉队列释放所有工作人员的内置方法 - 我以前写过阻塞队列,我倾向于使用模式(例如,from here):
public bool TryDequeue(out T value) {...}
用这个:
- 如果有数据则立即返回true
- 如果没有数据但添加了一些则阻塞并(最终)返回 true
- 如果队列正在关闭,则阻塞并(最终)返回 false
关于C# 是否可以中断 ThreadPool 中的特定线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2430609/