首页 > 其他分享 >线程池ThreadPool

线程池ThreadPool

时间:2023-09-27 11:27:00浏览次数:46  
标签:workerThreads int 创建 completionPortThreads ThreadPool 线程

1什么是线程池?

ThreadPool 类

  • 命名空间:System.Threading

  • 程序集:System.Threading.ThreadPool.dll

提供一个线程池,该线程池可用于执行任务、发送工作项、处理异步 I/O、代表其他线程等待以及处理计时器。

 

* 通过线程池创建的线程默认为后台线程,优先级默认为Normal。

 

2为什么用到线程?

 

上篇文章介绍了Thread的例子,但在实际开发中使用的线程往往是大量的和更为复杂的,每新建一个线程都需要占用内存空间和其他资源,而新建了那么多线程,有很多在休眠,或者在等待资源释放;又有许多线程只是周期性的做一些小工作,如刷新数据等等,太浪费了,划不来,实际编程中大量线程突发,然后在短时间内结束的情况很少见。于是,为此引入了线程池的概念。

 

好处

  1、减少在创建和销毁线程上所花的时间以及系统资源的开销 ①
  2、如不使用线程池,有可能造成系统创建大量线程而导致消耗完系统内存以及”过度切换”。

 

① 线程池中的线程执行完指定的方法后并不会自动消除,而是以挂起状态返回线程池,如果应用程序再次向线程池发出请求,那么处以挂起状态的线程就会被激活并执行任务,而不会创建新线程,这就节约了很多开销。只有当线程数达到最大线程数量,系统才会自动销毁线程。因此,使用线程池可以避免大量的创建和销毁的开支,具有更好的性能和稳定性,其次,开发人员把线程交给系统管理,可以集中精力处理其他任务。

 

4什么时候使用多线程?

 

1、并发运行若各个运行时间不长且互不干扰的任务
2、需要处理的任务的数量大 

线程池最多管理线程数量=“处理器数 * 250”。也就是说,如果您的机器为2个2核CPU,那么CLR线程池的容量默认上限便是1000。
5如何使用线程台线程

 

其实线程池使用起来很简单,常见函数如下

a.设置线程池最大最小:
// workerThreads:要由线程池根据需要创建的新的最小工作程序线程数。
// completionPortThreads:要由线程池根据需要创建的新的最小空闲异步 I/O 线程数。
// 返回结果:如果更改成功,则为 true;否则为 false。
[SecuritySafeCritical]
public static bool SetMinThreads(int workerThreads, int completionPortThreads);
ThreadPool.SetMaxThreads(1,1)
// workerThreads:线程池中辅助线程的最大数目。
// completionPortThreads: 线程池中异步 I/O 线程的最大数目。
// 返回结果:如果更改成功,则为 true;否则为 false。
[SecuritySafeCritical]
public static bool SetMaxThreads(int workerThreads, int completionPortThreads);
ThreadPool.SetMaxThreads(5,5)

 

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

b.将任务添加进线程池:
ThreadPool.QueueUserWorkItem(new WaitCallback(方法名));

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

 

6举例说明

 

 

运行结果如下:

 

 

每次运行的结果都不相同,上边代码把 Console.ReadKey(); 注释后,程序只执行了二个线程便退出,代表线程池本身为后台线程。

 

 

当我们需要知道 ThreadPool 什么时候终止时,可以利用信号灯AutoResetEvent和ManualResetEvent来解决问题。

 



运行结果如下:

 

标签:workerThreads,int,创建,completionPortThreads,ThreadPool,线程
From: https://www.cnblogs.com/w-pound/p/17732222.html

相关文章

  • Jmeter场景组合测试——多个线程组的设计方案
    我们绝大多数同学在使用jmeter进行性能测试时都会在一个线程组中完成测试工作,今天我来重点讲解一下jmeter多个线程组在测试中的应用,这也是关于jmeter性能测试面试过程中的进阶问题,希望能够帮到大家来解决工作中不同的测试需求。线程组中的线程执行顺序是什么?首先大家需要明确一......
  • Java多线程--Lesson03
    线程同步概念:线程同步指的是在多个线程操作同一资源时,需要通过线程排队和线程锁来约束这些线程,使得其可以对其资源完成同步并发指的是同一时间段内,有多个线程去操作同一个资源文件由于同一进程的多个线程共享一块空间资源,带来方便的同时也带来了冲突问题,为了保证数据在方法中......
  • 8.10 TLS线程局部存储反调试
    TLS(ThreadLocalStorage)用来在进程内部每个线程中存储私有的数据。每个线程都会拥有独立的TLS存储空间,可以在TLS存储空间中保存线程的上下文信息、变量、函数指针等。TLS其目的是为了解决多线程变量同步问题,声明为TLS变量后,当线程去访问全局变量时,会将这个变量拷贝到自己线程中的......
  • 多线程Review-926-01
    一、进程与线程1、进程:①电脑管家等软件我们运行的应用程序②在内存中正在运行的程序2、线程:①进程中的一个最小执行单元。一个进程最少得有一个线程②软件中的每一个功能,如电脑管家中的清理垃圾、杀毒、软件搜索二、线程的创建方式1、继承Thread类  :优点——代码......
  • Spring中构造器、init-method、@PostConstruct、afterPropertiesSet孰先孰后,自动注入
     引用:https://www.cnblogs.com/qlqwjy/p/9417034.html首先明白,spring的IOC功能需要是利用反射原理,反射获取类的无参构造方法创建对象,如果一个类没有无参的构造方法spring是不会创建对象的。在这里需要提醒一下,如果我们在class中没有显示的声明构造方法,默认会生成一个无参......
  • Java 21 正式 GA,虚拟线程真的来了
    UTC时间2023年9月19日,期盼已久的Java21终于发布正式版!本文一起来看看其中最受Java开发者关注的一项新特性:Loom项目的两个新特性之一的”虚拟线程(VirtualThread)“(另外一个新特性是”结构化并发(StructuredConcurrency)“,当前是预览状态),它被称之为Java版的”协......
  • 在Java中线程有几种状态?
    一、Java中线程六种状态线程在自身的生命周期中,并不是固定地处于某个状态,而是随着代码的执行在不同的状态之间进行切换......
  • 线程
    开线程的第一种方式:frommultiprocessingimportProcess #导入进程fromthreadingimportRhread #导入线程importtime  deftask(name):print('%sisruning'%name)time.sleep(1)print('%siisover')#开启线程不需要再main下面执行代码直接书写......
  • Linux-----进程、线程、协程的生命周期、调度器slab
    Linux进程、线程、协程的区别进程进程是操作系统中的一个独立执行单元。每个进程都有自己的独立内存空间,包括代码段、数据段、堆栈等。进程之间通常需要通过进程间通信(IPC)来交换数据和信息。进程启动和销毁开销较大,因为需要分配和释放独立的内存空间。进程之间隔离度高,一个......
  • 细说多线程,如何解决线程安全问题
    关于多线程,首先熟练分清楚线程和进程的关系:进程:内存中正在运行的一个程序线程:进程中的一个最小执行单元。一个进程最少得有一个线程(Java程序中一个请求就是一个线程)。一、创建多线程的方式有四种:1.继承Thread类1.定义一个子类继承Thread类,并重写run方法2.创建Thread的子类对......