5.线程

01.信号量Semaphore
限制可同时访问某一资源或资源池的线程数
public Semaphore(
int initialCount,
int maximumCount
)
参数
initialCount
Type: System.Int32
可以同时授予的信号量的初始请求数。

maximumCount
Type: System.Int32
可以同时授予的信号量的最大请求数。

WaitOne()和Release()
Semaphore常用的方法有两个WaitOne()和Release()。

使用WaitOne()方法相当于等待出现退出的线程,而使用Release()方法为让一个线程退出。

假设initialCount和maximumCount都为5,开始的时候线程池有5个空位置,且总共只有5个位置,当需要并行的线程数量超过5个时,首先使用WaitOne()方法等待,发现有空位就依次进去,每进去一个空位减1,直到进去5个线程之后,空位(initialCount)为0,这时候后面的线程就一直等待,直到有线程调用了Release()方法,主动退出线程池,空位加1,在等待的线程才能继续进入线程池。

WaitOne()方法可以填入参数,用于规定最大等待时间,等待超时后,空位自动加1,继续执行下一个线程。示例如下,等待时间为1000毫秒:

sem.WaitOne(1000, true);

  class Program
    {
        static void Main(string[] args)
        {
            MultiThreadSynergicWithSemaphore();
            Console.ReadKey();
        }

        private static void MultiThreadSynergicWithSemaphore()
        {
            //0表示创建Semaphore时,拥有可用信号量数值 代表剩余空位
            //1表示Semaphore中,最多容纳信号量数值 代表最大容量
            Semaphore semaphore =new Semaphore(0,1);

            Thread thread1=new Thread(() =>
            {
                //线程首先WaitOne等待一个可用的信号量 等待出现退出的线程
                semaphore.WaitOne();
                //在得到信号量后,执行下面代码内容
                Console.WriteLine("thread1 work");
                Thread.Sleep(1000);
                //线程执行完毕,将获得信号量释放(还给semaphore)
                semaphore.Release(); //让一个线程退出。
            });

            Thread thread2 = new Thread(() =>
            {
                semaphore.WaitOne();
                Console.WriteLine("thread2 work");
                Thread.Sleep(2000);
                semaphore.Release();
            });

            Thread thread3 = new Thread(() =>
            {
                semaphore.WaitOne();
                Console.WriteLine("thread3 work");
                Thread.Sleep(2000);
                semaphore.Release();
            });
            thread1.Start();
            thread2.Start();
            thread3.Start();
            //在创建Semaphore时拥有的信号量为0
            //semaphore.Release(1) 为加入1个信号量到semaphore中
            semaphore.Release();
        }
    }

在这里插入图片描述
02.线程池 TheadPool
如果ThreadPool中有空闲的线程,ThreadPool就会将你交付的任务分给一个空闲的线程去执行;如果ThreadPool中没有空闲的线程可用,ThreadPool就会自动新建一个线程来处理你交付的任务

static void Main(string[] args)
        {
            MultiThreadWithTheadPool();
            Console.ReadKey();
        }

        private static void MultiThreadWithTheadPool()
        {
            int maxThreadNum, portThreadNum, minThreadNum;
            //获取线程池的最大线程数和维护的最小空闲线程数
            ThreadPool.GetMaxThreads(out  maxThreadNum,out portThreadNum);
            ThreadPool.GetMinThreads(out minThreadNum,out  portThreadNum);
            ThreadPool.QueueUserWorkItem(new WaitCallback(ProcessFile));
            ThreadPool.QueueUserWorkItem(new WaitCallback(ProcessFileTwo));
            Console.WriteLine("最大线程数:{0}", maxThreadNum);
            Console.WriteLine("最小空闲线程数:{0}", minThreadNum);
        }

        private static void ProcessFile(object a)
        {
            Console.WriteLine(" 我被连接到线程池通过 WaitCallbackOne");
        }
        private static void ProcessFileTwo(object a)
        {
            Console.WriteLine(" 我被连接到线程池通过 WaitCallbackTwo");
        }

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值