假设我已将ThreadPool
中的工作项排队,但如果没有要处理的数据,则工作项会阻止(从BlockingQueue
读取)。如果队列是空的并且没有更多的工作进入队列,那么如果我想中断阻塞任务,我必须调用Thread.Interrupt
方法,但是如何用{{1来执行相同的操作}}?
代码可能如下所示:
ThreadPool
我知道在这种情况下最好的办法是使用常规void Run()
{
try
{
while(true)
{
blockingQueue.Dequeue();
doSomething();
}
}
finally
{
countDownLatch.Signal();
}
}
,但我想知道是否有一种Thread
等效的方式来中断工作项。
答案 0 :(得分:2)
是哪个BlockingQueue
?那是BCL课吗? TPL课程?还是定制?
无论如何;简单 - 我不会。你可以在线程生命的早期做一些事情来存储线程引用,但我根本不会使用ThreadPool
来完成这项工作,因为它听起来更长时间运行。常规Thread
似乎更合适。
我也很惊讶没有内置方法告诉队列释放所有工作人员 - 我之前编写了阻塞队列,我倾向于使用该模式(例如,from here):
public bool TryDequeue(out T value) {...}
用这个: