3

假设我在 a 中排队了一个工作项ThreadPool,但如果没有要处理的数据(从 a 读取BlockingQueue),则工作项会阻塞。如果队列是空的并且没有更多的工作进入队列,那么Thread.Interrupt如果我想中断阻塞任务,我必须调用该方法,但是如何用 a 做同样的事情ThreadPool呢?

代码可能如下所示:

void Run()
{
    try
    {
        while(true)
        {
            blockingQueue.Dequeue();
            doSomething();
        }
    }
    finally
    {
        countDownLatch.Signal();
    }
}

我知道在这种情况下最好的办法是使用常规Thread,但我想知道是否有ThreadPool等效的方法来中断工作项。

4

1 回答 1

2

BlockingQueue是哪个?那是BCL类吗?TPL 类?还是定制?

不管; 简单地说——我不会。你可以在线程生命的早期做一些事情来存储线程引用,但我根本不会使用ThreadPool这个工作,因为它听起来像是运行时间更长。常客Thread似乎更合适。

我也很惊讶没有告诉队列释放所有工作人员的内置方法 - 我以前写过阻塞队列,我倾向于使用这种模式(例如,从这里):

public bool TryDequeue(out T value) {...}

有了这个:

  • 如果有数据立即返回 true
  • 如果没有数据但添加了一些数据,则阻塞并(最终)返回 true
  • 如果队列正在关闭,阻塞并(最终)返回 false
于 2010-03-12T05:27:50.143 回答