首页 新闻 搜索 专区 学院

哪位能给我一个简单的多线程实例,详细看内容?

0
悬赏园豆:20 [已解决问题] 解决于 2008-12-08 16:25

哪位能给我一个简单的多线程实例:

用个变量N控制线程数,N个线程去读取一个数组的每一行,将数组全部输出就可以了。

最好能带点注释,用控制台程序就可以,谢谢!

问题补充: 补充一下:是只读取一遍数组,每次读取的行都不一样而已,读完为止。
启程的主页 启程 | 小虾三级 | 园豆:570
提问于:2008-12-08 10:17
< >
分享
最佳答案
0

    /// <summary>
    /// 多线程读取消息队列示例
    /// </summary>
    class MultiThread
    {
        private System.Threading.Thread[] _ThreadPool; //线程池

        MessageQueue<int> _MessageQueue = new MessageQueue<int>(10000); //初始化消息队列,队列最大长度为10000

        /// <summary>
        /// 线程工作函数
        /// </summary>
        private void Do()
        {
            while (true)
            {
                Console.WriteLine(string.Format("Message:{0} ThreadId:{1}",
                    _MessageQueue.Dequeue(), System.Threading.Thread.CurrentThread.ManagedThreadId));
            }
        }

        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="threadCount">线程数量</param>
        public MultiThread(int threadCount)
        {
            _ThreadPool = new System.Threading.Thread[threadCount];

            for (int i = 0 ; i < _ThreadPool.Length; i++)
            {
                _ThreadPool[i] =
                    new System.Threading.Thread(new System.Threading.ThreadStart(Do));
                _ThreadPool[i].IsBackground = true;
            }
        }

        /// <summary>
        /// 向消息队列插入20个数值
        /// </summary>
        public void Enqueue()
        {
            for (int msg = 0; msg < 20; msg++)
            {
                _MessageQueue.Enqueue(msg);
            }
        }

        /// <summary>
        /// 开始多线程读取消息队列
        /// </summary>
        public void Start()
        {
            for (int i = 0; i < _ThreadPool.Length; i++)
            {
                _ThreadPool[i].Start();
            }
        }
    }



    /// <summary>
    /// 消息队列,实现线程安全的消息入队和出队
    /// </summary>
    class MessageQueue<T>
    {
        Queue<T> _MessageQueue = new Queue<T>();
        System.Threading.Semaphore _Sema = new System.Threading.Semaphore(0, 1000000);

        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="queueSize">消息队列的最大长度</param>
        public MessageQueue(int queueSize)
        {
            _Sema = new System.Threading.Semaphore(0, queueSize);
        }

        /// <summary>
        /// 入队,向队列插入一条消息,并将信号量加一
        /// </summary>
        /// <param name="value"></param>
        public void Enqueue(T value)
        {
            lock (this)
            {
                _MessageQueue.Enqueue(value);
                _Sema.Release(1);
            }
        }

        /// <summary>
        /// 出队,等待信号量
        /// 从队列中取出一个消息
        /// </summary>
        /// <returns></returns>
        public T Dequeue()
        {
            _Sema.WaitOne();

            lock (this)
            {
                return _MessageQueue.Dequeue();
            }
        }

    }

 

//主函数

class Program
{
static void Main(string[] args)
{
MultiThread multiThread = new MultiThread(10);
multiThread.Enqueue();
multiThread.Start();
}
}

eaglet | 专家六级 |园豆:17119 | 2008-12-08 11:49
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册