码迷,mamicode.com
首页 > 编程语言 > 详细

多线程协同

时间:2014-12-04 12:00:38      阅读:267      评论:0      收藏:0      [点我收藏+]

标签:style   blog   io   ar   color   os   sp   for   on   

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Diagnostics;
using System.IO;

namespace WaitOneTest
{
    class Program
    {
        static void Main(string[] args)
        {
            Program p = new Program();

            Console.ReadLine();
        }

        private HashSet<string> m_sAllWork; // 所有工作
        private Queue<string> m_qWaiting; // 等待队列
        private AutoResetEvent m_WorkingEvent = null; // 工作事件
        private AutoResetEvent m_ResumeEvent = null; // 继续事件
        private Thread m_MonitorThread = null; // 监控线程
        private Thread m_WorkingThread = null; // 工作线程
        private Thread m_PatrolThread = null; // 巡逻线程

        public Program()
        {
            Console.WriteLine("Program starting.");

            m_sAllWork = new HashSet<string>();
            m_qWaiting = new Queue<string>();
            m_WorkingEvent = new AutoResetEvent(false);
            m_ResumeEvent = new AutoResetEvent(false);
            m_MonitorThread = new Thread(new ThreadStart(DoMonitor));
            m_WorkingThread = new Thread(new ThreadStart(DoWork));
            m_PatrolThread = new Thread(new ThreadStart(DoPatrol));
            m_MonitorThread.Start();
            m_WorkingThread.Start();
            m_PatrolThread.Start();
            m_WorkingThread.Join();

            Console.WriteLine("Program ending.");
        }

        private void DoWork()
        {
            Console.WriteLine("Work starting.");
            try
            {
                do
                {
                    m_WorkingEvent.Set();
                    string filename = null;
                    try
                    {
                        lock (m_qWaiting)
                        {
                            filename = m_qWaiting.Dequeue();
                        }
                    }
                    catch (InvalidOperationException)
                    {
                        Console.WriteLine("Queue is empty now.");
                        m_ResumeEvent.WaitOne(2000); // 空闲时间(该值要小于巡逻周期值)
                        continue;
                    }
                    catch (Exception e)
                    {
                        Console.WriteLine("Thread - caught Exception - " + e.Message);
                    }
                    Console.WriteLine("Do work. - " + filename);
                    try
                    {
                        Thread.Sleep(new Random().Next(1000, 5000));
                    }
                    catch (ThreadAbortException)
                    {
                        Console.WriteLine("Thread - caught ThreadAbortException - resetting.");
                        lock (m_qWaiting)
                        {
                            m_qWaiting.Enqueue(filename); // 失败的文件加回队列末尾
                        }
                        Thread.ResetAbort(); // 取消中断
                        Thread.Sleep(100); // 睡眠100毫秒,允许外部通过调用Interrupt退出线程。
                    }
                    catch (Exception e)
                    {
                        Console.WriteLine("Thread - caught Exception - " + e.Message);
                        lock (m_qWaiting)
                        {
                            m_qWaiting.Enqueue(filename); // 失败的文件加回队列末尾
                        }
                    }
                } while (true);
            }
            catch (Exception e)
            {
                Console.WriteLine("Thread - caught Exception - " + e.Message);
            }
            Console.WriteLine("Work ending.");
        }

        private void DoPatrol()
        {
            Console.WriteLine("Patrol starting.");

            try
            {
                do
                {
                    Console.WriteLine("Wait for work method to signal.");
                    // Wait for work method to signal.
                    if (m_WorkingEvent.WaitOne(4000)) // 巡逻周期
                    {
                        Console.WriteLine("Work method signaled.");
                    }
                    else
                    {
                        Console.WriteLine("Timed out waiting for work method to signal.");
                        m_WorkingThread.Abort(); // 中断工作任务(工作线程被卡住,需要中断来恢复,工作线程中通过抓捕相应异常类型进行处理)
                    }
                } while (true);
            }
            catch (Exception e)
            {
                Console.WriteLine("Thread - caught Exception - " + e.Message);
            }

            Console.WriteLine("Patrol ending.");
        }

        private void DoMonitor()
        {
            Console.WriteLine("Monitor starting.");

            try
            {
                lock (m_qWaiting)
                {
                    for (int i = 0; i < 10; i++)
                    {
                        if (!m_sAllWork.Contains(i.ToString()))
                        {
                            m_sAllWork.Add(i.ToString());
                            m_qWaiting.Enqueue(i.ToString());
                        }
                    }
                    if (m_qWaiting.Count > 0)
                        m_ResumeEvent.Set();  // 恢复工作线程(因为工作线程可能处于空闲等待)
                }
                do
                {
                    // 随机时间内产生一个工作任务
                    Thread.Sleep(new Random().Next(1000, 60000));
                    int i = new Random().Next(1, 1000);
                    if (!m_sAllWork.Contains(i.ToString()))
                    {
                        m_sAllWork.Add(i.ToString());
                        m_qWaiting.Enqueue(i.ToString());
                        m_ResumeEvent.Set(); // 恢复工作线程(因为工作线程可能处于空闲等待)
                    }
                } while (true);
            }
            catch (Exception e)
            {
                Console.WriteLine("Thread - caught Exception - " + e.Message);
            }

            Console.WriteLine("Monitor ending.");
        }
    }
}

 

多线程协同

标签:style   blog   io   ar   color   os   sp   for   on   

原文地址:http://www.cnblogs.com/plus/p/4142124.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!