转载至 https://www.codeproject.com/Articles/28785/Thread-synchronization-Wait-and-Pulse-demystified

/*
* 这是一个完整源代码示例,演示了此模式的多功能性。它实现了一个可以停止的阻塞队列。
* 阻塞队列是固定大小的队列。如果队列已满,则尝试添加项目将被阻止。
* 如果队列为空,则尝试删除项目将阻止。
* 当Quit()被调用时,队列停止。这意味着您无法再添加任何项目,但可以删除现有项目,直到队列为空。此时,队列已完成。
* 这是一组非常复杂的条件。您可以使用更高级别的结构组合来实现它,但它会更难。该模式使得该实现相对简单。
*
*/
using System;
using System.Threading;
using System.Collections.Generic; namespace TestBlockQueue
{
public class BlockingQueue<T>
{
readonly int _Size = ;
readonly Queue<T> _Queue = new Queue<T>();
readonly object _Key = new object();
bool _Quit = false; public BlockingQueue(int size)
{
_Size = size;
} public void Quit()
{
lock (_Key)
{
_Quit = true; Monitor.PulseAll(_Key);
}
} public bool Enqueue(T t)
{
lock (_Key)
{
while (!_Quit && _Queue.Count >= _Size) Monitor.Wait(_Key); if (_Quit) return false; _Queue.Enqueue(t); Monitor.PulseAll(_Key);
} return true;
} public bool Dequeue(out T t)
{
t = default(T); lock (_Key)
{
while (!_Quit && _Queue.Count == ) Monitor.Wait(_Key); if (_Queue.Count == ) return false; t = _Queue.Dequeue(); Monitor.PulseAll(_Key);
} return true;
}
} /// <summary>
/// 对于任意数量的生产者和消费者的并发访问,此实现是安全的。以下是一个快速生产者和两个慢速消费者的示例
/// </summary>
public class Program
{
public static void Main(string[] args)
{
var q = new BlockingQueue<int>(); // Producer
new Thread(() =>
{
for (int x = ; ; x++)
{
if (!q.Enqueue(x)) break;
Console.WriteLine(x.ToString("") + " >");
}
Console.WriteLine("Producer quitting");
}).Start(); // Consumers
for (int i = ; i < ; i++)
{
new Thread(() =>
{
for (; ; )
{
Thread.Sleep();
int x = ;
if (!q.Dequeue(out x)) break;
Console.WriteLine(" < " + x.ToString(""));
}
Console.WriteLine("Consumer quitting");
}).Start();
} Thread.Sleep(); Console.WriteLine("Quitting"); q.Quit();
}
}
}

Monitor 实现阻塞队列 + 生产消费者实例的更多相关文章

  1. 10 阻塞队列 & 生产者-消费者模式

    原文:http://www.cnblogs.com/dolphin0520/p/3932906.html 在前面我们接触的队列都是非阻塞队列,比如PriorityQueue.LinkedList(Li ...

  2. Day034--Python--锁, 信号量, 事件, 队列, 生产者消费者模型, joinableQueue

    进程同步: 1. 锁 (重点)    锁通常被用来实现对共享资源的同步访问.为每一个共享资源创建一个Lock对象,当你需要访问该资源时,调用acquire方法来获取锁对象(如果其它线程已经获得了该锁, ...

  3. python 全栈开发,Day39(进程同步控制(锁,信号量,事件),进程间通信(队列,生产者消费者模型))

    昨日内容回顾 python中启动子进程并发编程并发 :多段程序看起来是同时运行的ftp 网盘不支持并发socketserver 多进程 并发异步 两个进程 分别做不同的事情 创建新进程join :阻塞 ...

  4. 5 并发编程-(进程)-队列&生产者消费者模型

    1.队列的介绍 进程彼此之间互相隔离,要实现进程间通信(IPC),multiprocessing模块支持两种形式:队列和管道,这两种方式都是使用消息传递的 创建队列的类(底层就是以管道和锁定的方式实现 ...

  5. Python——Queue模块以及生产消费者模型

    1.了解Queue Queue是python标准库中的线程安全的队列(FIFO)实现,提供了一个适用于多线程编程的先进先出的数据结构,即队列,用来在生产者和消费者线程之间的信息传递 |queue.Qu ...

  6. Java 并发系列之七:java 阻塞队列(7个)

    1. 基本概念 2. 实现原理 3. ArrayBlockingQueue 4. LinkedBlockingQueue 5. LinkedBlockingDeque 6. PriorityBlock ...

  7. Java并发之BlockingQueue 阻塞队列(ArrayBlockingQueue、LinkedBlockingQueue、DelayQueue、PriorityBlockingQueue、SynchronousQueue)

    package com.thread.test.thread; import java.util.Random; import java.util.concurrent.*; /** * Create ...

  8. 你真的知道.NET Framework中的阻塞队列BlockingCollection的妙用吗?

    BlockingCollection集合是一个拥有阻塞功能的集合,它就是完成了经典生产者消费者的算法功能.一般情况下,我们可以基于 生产者 - 消费者模式来实现并发.BlockingCollectio ...

  9. BlockingQueue 阻塞队列(生产/消费者队列)

    1:BlockingQueue的继承关系 java.util.concurrent 包里的 BlockingQueue是一个接口, 继承Queue接口,Queue接口继承 Collection Blo ...

随机推荐

  1. #安装memcache

    安装memcache sudo apt-get install memcached sudo apt search php-memcache sudo apt-get install php-memc ...

  2. python学习-65 继承2-子类中调用父类的方法

    子类中调用父类的方法 1.子类继承了父类的方法,然后想进行修改,那么就需要在子类中调用父类的方法. 2.方法一:父类名 class School: Country = 'china' def __in ...

  3. asp.net Code CSRedis学习记录

    1.安装Redis for windows 安装地址 https://github.com/MicrosoftArchive/redis/releases Redis 是完全开源免费的,遵守BSD协议 ...

  4. quartz2.3.0(十一)任务执行中故障情况,可设置重新执行任务

    任务类 package org.quartz.examples.example11; import org.quartz.Job; import org.quartz.JobExecutionCont ...

  5. chmod: changing permissions of 'xxx': Operation not permitted

    众所周知,在linux系统中,权限最大的是root账号,但凡修改涉及到系统本身的重大权限的操作,都需要root的权限才能操作.但是有些时候也有root干不了的事情. 比如:chmod: changin ...

  6. Thread 与 ThreadLocal

    @Testpublic void testThread() { Thread thread = Thread.currentThread(); System.out.println("thr ...

  7. 记录Quarter的基本使用

    原文:记录Quarter的基本使用 using Quartz; using Quartz.Impl; using Quartz.Impl.Matchers; using Quartz.Logging; ...

  8. Bootstrap-table 使用总结,和其参数说明

    转载于:https://www.cnblogs.com/laowangc/p/8875526.html 一.什么是Bootstrap-table? 在业务系统开发中,对表格记录的查询.分页.排序等处理 ...

  9. Window 服务器安装MongoDB 设置外网可访问

    1.下载MongoDB www.mongodb.com/download-center#community 2.下一步下一步安装. 安装完成后配置环境变量 我的的默认安装,环境变量地址  C:\Pro ...

  10. win10 查看本机的激活秘钥

    系统的注册表中,找到如下位置 计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SoftwareProtectio ...