![](/img/trans.png)
[英]Does thread is alive if Take blocks in blocking collection class (.NET)?
[英]BlockingCollection class: Does thread yield if Take blocks?
MSDN说BlockingCollection.Take调用块,如果没有元素。 这是否意味着线程将产生时间片并进入等待线程队列?
如果是,是否意味着一旦阻塞集合收到一个项目,线程将其状态更改为就绪,然后将按照通常的规则安排到下一个时间片?
是。 当您在BlockingCollection<T>
上调用Take()
时,线程将被阻塞(等待事件句柄),直到元素从另一个线程添加到集合中。 这将导致该线程放弃其时间片。
将一个元素添加到集合中时,线程将发出信号以继续,获取元素并继续。
我认为这可能会让更多读者感兴趣。 这就是我为事实建立这个的方法。
class Program
{
static BlockingCollection<int> queue = new BlockingCollection<int>();
static Thread th = new Thread(ThreadMethod);
static Thread th1 = new Thread(CheckMethod);
static void Main(string[] args)
{
th.Start();
th1.Start();
for (int i = 0; i < 100; i++)
{
queue.Add(i);
Thread.Sleep(100);
}
th.Join();
Console.ReadLine();
}
static void ThreadMethod()
{
while (!queue.IsCompleted)
{
int r = queue.Take();
Console.WriteLine(r);
}
}
static void CheckMethod()
{
while (!queue.IsCompleted)
{
Console.WriteLine(th.ThreadState);
Thread.Sleep(48);
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.