我有一个我无法弄清楚的问题。这可能不容易解释。
我有一个带有这个私有构造函数的单例类:
private BarcodeMonitor()
{
processors[Machines.H1] = new BarcodeProcessor { Queue = new BlockingQueue<BarcodeData>("H1") };
processors[Machines.H2] = new BarcodeProcessor { Queue = new BlockingQueue<BarcodeData>("H2") };
processors[Machines.M] = new BarcodeProcessor { Queue = new BlockingQueue<BarcodeData>("M") };
processors[Machines.HP] = new BarcodeProcessor { Queue = new BlockingQueue<BarcodeData>("HP") };
foreach (KeyValuePair<Machines, BarcodeProcessor> pair in processors)
{
Thread t = new Thread(t1 => pair.Value.StartProccesingQueue());
t.Name = pair.Key.ToString() + "Processor";
t.Start();
threads.Add(t);
}
}
为BlockingQueue
提供了一个新的唯一BarcodeProcessor
并取名。
BarcodeMonitor
有这种方法:
public BlockingQueue<BarcodeData> GetQueue(Machines machine)
{
var processor = processors[machine];
return processor.Queue;
}
以便将传入的条形码放入正确的机器的队列中。这很好。
条形码在StartProccesingQueue()
中出列(其中4个实例正在运行)。在出列方法中,我有:
System.Console.WriteLine(string.Format("Thread {0} is taking from queue {1}", Thread.CurrentThread.Name, name));
当队列为空时, Dequeue()
使用Monitor.Wait(_internalQueue)
。 Enqueue()
使用Monitor.PulseAll(_internalQueue)
继续等待队列。
正在发生的是StartProccesingQueue()
方法从其他队列获取,即使它只访问分配有新Queue
的{{1}}属性。事实上,到目前为止,我只看到了队列中的项目&#34; M&#34;被采取,只有H1和H2线程正在这样做。
我真的不明白为什么会这样。
答案 0 :(得分:0)
好吧,我对此并不十分肯定,但我认为当您执行pulseAll(_internalQueue)
时,所有等待的线程都会注意到_internalQueue
现已准备就绪,请参阅MSDN PulseAll() 。
也许只试试pulse(_internalQueue)
这应该只通知等待_internalQueue
的主题,请参阅MSDN pulse()。