C# 线程池ThreadPool的用法简析

什么是线程池?为什么要用线程池?怎么用线程池?

1. 什么是线程池?

        .NET Framework的ThreadPool类提供一个线程池,该线程池可用于执行任务、发送工作项、处理异步 I/O、代表其他线程等待以及处理计时器。那么什么是线程池?线程池其实就是一个存放线程对象的“池子(pool)”,他提供了一些基本方法,如:设置pool中最小/最大线程数量、把要执行的方法排入队列等等。ThreadPool是一个静态类,因此可以直接使用,不用创建对象。

2. 为什么要用线程池?好处是什么?

        微软官网说法如下:许多应用程序创建大量处于睡眠状态,等待事件发生的线程。还有许多线程可能会进入休眠状态,这些线程只是为了定期唤醒以轮询更改或更新的状态信息。 线程池,使您可以通过由系统管理的工作线程池来更有效地使用线程。

        说得简单一点,每新建一个线程都需要占用内存空间和其他资源,而新建了那么多线程,有很多在休眠,或者在等待资源释放;又有许多线程只是周期性的做一些小工作,如刷新数据等等,太浪费了,划不来,实际编程中大量线程突发,然后在短时间内结束的情况很少见。于是,就提出了线程池的概念。线程池中的线程执行完指定的方法后并不会自动消除,而是以挂起状态返回线程池,如果应用程序再次向线程池发出请求,那么处以挂起状态的线程就会被激活并执行任务,而不会创建新线程,这就节约了很多开销。只有当线程数达到最大线程数量,系统才会自动销毁线程。因此,使用线程池可以避免大量的创建和销毁的开支,具有更好的性能和稳定性,其次,开发人员把线程交给系统管理,可以集中精力处理其他任务。


3. 怎么使用线程池?

其实线程池使用起来很简单,如下

a.设置线程池最大最小:

ThreadPool.SetMaxThreads (int workerThreads,int completionPortThreads)
设置可以同时处于活动状态的线程池的请求数目。所有大于此数目的请求将保持排队状态,直到线程池线程变为可用。还可以设置最小线程数。

b.将任务添加进线程池:

ThreadPool.QueueUserWorkItem(new WaitCallback(方法名));


ThreadPool.QueueUserWorkItem(new WaitCallback(方法名), 参数);

举个小例子,线程池中最多5个线程,执行一个方法60次,算5年总工资,如下:



如果不采用线程池,恐怕要开60线程异步执行Run()方法,空间资源之浪费,可见一斑。而现在我们最多用了5个线程,1秒内即可执行完毕,效率、性能都很好。

  • 15
    点赞
  • 105
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
以下是引用中的代码示例: ```java ExecutorService executor = Executors.newFixedThreadPool(2); Runnable worker = new Runnable() { public void run() { // do some work } }; executor.execute(worker); ``` 这段代码创建了一个固定大小的线程池,其中corePoolSize为2,maximumPoolSize也为2。这意味着线程池最多会保持2个线程处于活动状态,并在任务到达时创建新的线程来处理任务。当队列中没有任务时,线程池中的线程会进入空闲状态,直到有新的任务到来。如果使用的是无界队列(例如LinkedBlockingQueue),那么线程数就不会超过corePoolSize。keepAliveTime参数指定了线程池中的空闲线程在等待新任务时的存活时间。 以下是引用中的代码示例: ```java ExecutorService executor = Executors.newFixedThreadPool(5); Runnable worker = new Runnable() { public void run() { // do some work } }; executor.execute(worker); ``` 这段代码创建了一个固定大小的线程池,其中corePoolSize为5,maximumPoolSize也为5。这意味着线程池最多会保持5个线程处于活动状态,并在任务到达时创建新的线程来处理任务。当队列中没有任务时,线程池中的线程会进入空闲状态,直到有新的任务到来。如果使用的是无界队列(例如LinkedBlockingQueue),那么线程数就不会超过corePoolSize。keepAliveTime参数指定了线程池中的空闲线程在等待新任务时的存活时间。这段代码创建了一个5个线程的线程池,如果需要创建更多的线程,可以调整corePoolSize和maximumPoolSize的值。如果使用的是有界队列(例如ArrayBlockingQueue),那么可以通过调用put()方法将任务放入队列中。这段代码展示了如何创建一个固定大小的线程池,并使用execute()方法执行任务。如果需要停止线程池,可以使用shutdown()方法或者shutdownNow()方法。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [线程池ThreadPool详解](https://blog.csdn.net/qq_43651945/article/details/124717896)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值