第三节:ThreadPool的线程开启、线程等待、线程池的设置、定时功能

一. ThreadPool简介

  ThreadPool简介:ThreadPool是一个线程池,当你需要开启n个线程时候,只需把这个指令抛给线程池,它将自动分配线程进行处理,它诞生于.Net 2.0时代。

  ThreadPool与Thread的区别:

    ①:Thread每开启一个异步任务,就需要使用一个Thread,具有专一性,即使Thread已经死掉,仍然需要占用资源。

    ②:ThreadPool能实现n个线程处理n+m个异步任务,且没有死线程,默认都是初始化的。

二. 深究ThreadPool类

1:QueueUserWorkItem方法,将方法排入队列以便开启异步线程,它有两个重载。

  a:QueueUserWorkItem(WaitCallback callBack),WaitCallback是一个有一个object类型参数且无返回值的委托

  b:QueueUserWorkItem(WaitCallback callBack, object state),WaitCallback是一个有一个object类型参数且无返回值的委托,state即WaitCallback中需要的参数, 不推荐这么使用,存在拆箱装箱的转换问题,影响性能。

使用方式:

  a:严格的卡定义的写法,第一个重载和第二个重载均是处理有一个参数的函数,大于一个参数需要封装一个实体类,所需参数在实体类的构造函数中引入,然后调用第一个重载即可.

   (不推荐这种写法)

通用写法 (可以处理任何参数个数的方法),这里不使用n即可。

 ThreadPool.QueueUserWorkItem((n) =>

{

  TestThread2(i.ToString(),i.ToString());

});

通用写法的简化版:

ThreadPool.QueueUserWorkItem(n => TestThread2(i.ToString(), i.ToString()));

 代码如下:

第三节:ThreadPool的线程开启、线程等待、线程池的设置、定时功能

2:线程等待(有局限性的)

   利用ManualResetEvent类和WaitOne方法,多个线程的话需要写for循环。

 第三节:ThreadPool的线程开启、线程等待、线程池的设置、定时功能

运行结果:

 第三节:ThreadPool的线程开启、线程等待、线程池的设置、定时功能

3:常用方法

  a:设置工作线程和IO线程的最大和最小值,SetMaxThreads和SetMinThreads。

  b:获取工作线程和IO线程最大、最小、可用值,GetMaxThreads、GetMinThreads、GetAvailableThreads。

第三节:ThreadPool的线程开启、线程等待、线程池的设置、定时功能

测试结果:

 第三节:ThreadPool的线程开启、线程等待、线程池的设置、定时功能

第三节:ThreadPool的线程开启、线程等待、线程池的设置、定时功能

 

三. 扩展一个定时器功能

1:RegisterWaitForSingleObject类,但是不常用.(涉及到定时任务,建议使用Quartz.Net)

2:System.threading命名空间下的Thread类,通过查看源码,构造函数中有四个参数,第一个是object参数的委托,第二个是委托需要的值,

   第三个是调用 callback 之前延迟的时间量(以毫秒为单位)

   第四个是 调用 callback 的时间间隔(以毫秒为单位)

第三节:ThreadPool的线程开启、线程等待、线程池的设置、定时功能

第三节:ThreadPool的线程开启、线程等待、线程池的设置、定时功能

 1   private void button12_Click(object sender, EventArgs e)
 2         {
 3             Stopwatch watch = new Stopwatch();
 4             watch.Start();
 5             Console.WriteLine("----------------- button_Click 开始 主线程id为:{0}  --------------------------", Thread.CurrentThread.ManagedThreadId);
 6 
 7             #region 01-RegisterWaitForSingleObject
 8             //{
 9             //    //每隔3s开启一个线程执行业务逻辑
10             //    ThreadPool.RegisterWaitForSingleObject(new AutoResetEvent(true), new WaitOrTimerCallback((obj, b) =>
11             //    {
12             //        //做逻辑判断,编写业务逻辑
13             //        Console.WriteLine("obj={0},tid={1}, datetime={2}", obj, Thread.CurrentThread.ManagedThreadId, DateTime.Now);
14 
15             //    }), "hello world", 3000, false); 
16             //}      
17             #endregion
18 
19             #region 02-Timer类
20             {
21                 //2秒后开启该线程,然后每隔4s调用一次
22                 System.Threading.Timer timer = new System.Threading.Timer((n) =>
23                 {
24                     //书写业务逻辑
25                     Console.WriteLine("我是子线程中的业务逻辑哦");
26                 }, "1", 2000, 4000);
27             }
28             #endregion
29 
30 
31             watch.Stop();
32             Console.WriteLine("----------------- button_Click 结束 主线程id为:{0}  总耗时:{1}--------------------------", Thread.CurrentThread.ManagedThreadId, watch.ElapsedMilliseconds);
33 
34         }

 

第三节:ThreadPool的线程开启、线程等待、线程池的设置、定时功能第三节:ThreadPool的线程开启、线程等待、线程池的设置、定时功能 sinolover 发布了487 篇原创文章 · 获赞 46 · 访问量 7万+ 私信 关注
上一篇:Spring Boot运用多线程实例


下一篇:如何管理默认的Java SwingWorker线程池?