C# 线程池同步

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

namespace Thread
{
    class Program
    {
        static void Main(string[] args)
        {
            //把线程池的最大值设置为1000
            ThreadPool.SetMaxThreads(1000, 1000);
            ThreadMessage("Start");
            //启动工作者线程
            ThreadPool.QueueUserWorkItem(new WaitCallback(AsyncCallback), "A");
            ThreadPool.QueueUserWorkItem(new WaitCallback(AsyncCallback), "B");
            while (true) ;
        }

        private static object _lockQueue = new object();
        public static void AsyncCallback(object state)
        {
            int i=0;
            while (i < 20)
            {
                
                System.Threading.Thread.Sleep(1000);
                Monitor.Enter(_lockQueue); //锁定,保持同步
                ThreadMessage(state.ToString());
                Console.Write("Async thread do work!" + i.ToString());
                System.Threading.Thread.Sleep(100);
                Console.WriteLine(state.ToString() );
                i++;
                Monitor.Exit(_lockQueue); //解锁
            }
        }
        
        //显示线程现状
        public static void ThreadMessage(string data)
        {
             string message = string.Format("id:{0}   CurrentThreadId is {1}",
                 data, System.Threading.Thread.CurrentThread.ManagedThreadId);
             Console.WriteLine(message);
        }
    }
}








当某个线程在Monitor.Entry返回后就获得了对其中_lockQueue的访问权限,其他试图获取_lockQueue 的线程将被阻塞,直到线程调用Monitor.Exit释放_lockQueue 的所有权。这意味着下面三点:

如果_lockQueue 是空闲的,那么第一个调用Entry的线程将立即获得_lockQueue ;
如果调用Entry的线程已经获准访问_lockQueue ,那么不会阻塞;
如果调用Entry时_lockQueue 已被其他线程锁定,则线程等待直到_lockQueue 解锁;
bool b = Monitor.TryEnter(_lockQueue,200); //锁定 时间超出
                if (b)
                {
                    ThreadMessage(state.ToString());
                    Console.Write("Async thread do work!" + i.ToString());
                    System.Threading.Thread.Sleep(200);
                    Console.WriteLine(state.ToString());
                    i++;
                }
                if(b)
                    Monitor.Exit(_lockQueue); //解锁



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值