代码之家  ›  专栏  ›  技术社区  ›  Kiril

C是否可以中断线程池中的特定线程?

  •  3
  • Kiril  · 技术社区  · 14 年前

    假设我在 ThreadPool ,但如果没有要处理的数据(从 BlockingQueue )。如果队列是空的,并且没有更多的工作进入队列,那么我必须调用 Thread.Interrupt 方法,如果我想中断阻塞任务,但是如何使用 螺纹工具 ?

    代码可能如下所示:

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

    我知道在这种情况下最好的做法是使用 Thread 但是我想知道 螺纹工具 中断工作项的等效方法。

    1 回复  |  直到 14 年前
        1
  •  2
  •   Community c0D3l0g1c    7 年前

    哪个 BlockingQueue 是吗?那是BCL课程吗?TPL等级?还是习惯?

    不管;简单地说-我不会的。你 能够 在线程生命的早期做一些事情来存储线程引用,但我只是不使用 ThreadPool 对于这项工作来说,它的运行时间似乎更长。普通的 Thread 似乎更合适。

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

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

    有了这个:

    • 如果有数据,立即返回true
    • 如果没有数据但添加了一些数据,则阻塞并(最终)返回true
    • 如果正在关闭队列,则阻塞并(最终)返回false