AutoResetEvent来模拟实现生产消费问题
2015-12-03 14:23
453 查看
static void Main(string[] args)
{
ProducerConsumerQueue q = new ProducerConsumerQueue();
q.EnQueueTask("Hello");
for (int i = 0; i < 10; i++) q.EnQueueTask("Say " + i);
q.EnQueueTask("Goodbye!");
Console.ReadKey();
}
}
public class ProducerConsumerQueue
{
EventWaitHandle _wh = new AutoResetEvent(false);
Queue<string> _tasks = new Queue<string>();
object _locker = new object();
public ProducerConsumerQueue()
{
//创建并启动工作线程
Thread tr = new Thread(work);
tr.Start();
}
public void EnQueueTask(string task)
{
lock (_locker)
_tasks.Enqueue(task);
_wh.Set();//一旦有任务了,唤醒等待的线程
}
public void work()
{
while (true)
{
string task = null;
lock (_locker)
{
if (_tasks.Count > 0)
{
task = _tasks.Dequeue();
}
if (task != null)
{
Console.WriteLine("Doing task " + task);
Thread.Sleep(1000);
}
else
{
_wh.WaitOne();
}
}
}
}
{
ProducerConsumerQueue q = new ProducerConsumerQueue();
q.EnQueueTask("Hello");
for (int i = 0; i < 10; i++) q.EnQueueTask("Say " + i);
q.EnQueueTask("Goodbye!");
Console.ReadKey();
}
}
public class ProducerConsumerQueue
{
EventWaitHandle _wh = new AutoResetEvent(false);
Queue<string> _tasks = new Queue<string>();
object _locker = new object();
public ProducerConsumerQueue()
{
//创建并启动工作线程
Thread tr = new Thread(work);
tr.Start();
}
public void EnQueueTask(string task)
{
lock (_locker)
_tasks.Enqueue(task);
_wh.Set();//一旦有任务了,唤醒等待的线程
}
public void work()
{
while (true)
{
string task = null;
lock (_locker)
{
if (_tasks.Count > 0)
{
task = _tasks.Dequeue();
}
if (task != null)
{
Console.WriteLine("Doing task " + task);
Thread.Sleep(1000);
}
else
{
_wh.WaitOne();
}
}
}
}
相关文章推荐
- java必学必会之方法的重载(overload)
- 租房宝开发心得
- The X New Developer’s Guide——前言
- 优化UITableView性能
- #ifndef和#define的含义
- 点击微信输入框页面放大以及页面布局等若干问题的记录
- jQuery源码学习13——Ajax
- oracle根据分隔符将字符串分割成数组函数
- JAVA静态的主函数
- html5 自定义文件上传
- java ImageIO处理图像的封装
- React Native 实现原生模块 实现拨打电话功能
- serialVersionUID作用
- PostgreSQL 硬件性能调整
- Codeforces Round #334 (Div. 2) C. Alternative Thinking
- 个人php开发工具
- 位运算学习笔记
- java 时区处理机制(0时区转换到服务器时区)
- Sublime Text 3配置php语法错误提示插件PHPCS
- hibernate常见关系的操作