线程池是什么,线程池及其原理
学习线程时,我们描述了一个多线程的 Web 服务器,每当服务器接收到一个请求时,它都会创建一个单独线程来处理请求。虽然创建一个单独线程肯定优于创建一个单独进程,但是多线程服务器仍然有些潜在的问题。
第一个问题是创建线程所需的时间多少,以及线程在完成工作之后会被丢弃的事实。第二个问题更为麻烦,如果允许所有并发请求都通过新线程来处理,那么我们没有限制系统内的并发执行线程的数量。无限制的线程可能耗尽系统资源,如 CPU 时间和内存。解决这个问题的一种方法是使用线程池。
线程池的主要思想是:在进程开始时创建一定数量的线程,并加到池中以等待工作。当服务器收到请求时,它会唤醒池内的一个线程(如果有可用线程),并将需要服务的请求传递给它。一旦线程完成了服务,它会返回到池中再等待工作。如果池内没有可用线程,那么服务器会等待,直到有空线程为止。
线程池具有以下优点:
池内线程的数量可以通过一些因素来加以估算,如系统 CPU 的数量、物理内存的大小和并发客户请求数量的期望值等。更为高级的线程池架构可以根据使用模式动态调整池内线程数量。这类架构在系统负荷低时,提供了较小的池,从而减低内存消耗(如 Apple的大中央调度)。
Windows API 提供了与线程池有关的多个函数。使用线程池 API 类似于通过函数 Thread_Create() 来创建线程,参见《线程库》一节。这里,定义一个函数,以作为单独线程来运行。这样一个函数如下所示:
调用这个函数的示例如下:
Windows 线程池 API 还包括可周期性地调用函数,或在一个异步 I/O 请求结束时调用函数。Java API 的
第一个问题是创建线程所需的时间多少,以及线程在完成工作之后会被丢弃的事实。第二个问题更为麻烦,如果允许所有并发请求都通过新线程来处理,那么我们没有限制系统内的并发执行线程的数量。无限制的线程可能耗尽系统资源,如 CPU 时间和内存。解决这个问题的一种方法是使用线程池。
线程池的主要思想是:在进程开始时创建一定数量的线程,并加到池中以等待工作。当服务器收到请求时,它会唤醒池内的一个线程(如果有可用线程),并将需要服务的请求传递给它。一旦线程完成了服务,它会返回到池中再等待工作。如果池内没有可用线程,那么服务器会等待,直到有空线程为止。
线程池具有以下优点:
- 用现有线程服务请求比等待创建一个线程更快。
- 线程池限制了任何时候可用线程的数量。这对那些不能支持大量并发线程的系统非常重要。
- 将要执行任务从创建任务的机制中分离出来,允许我们采用不同策略运行任务。例如,任务可以被安排在某一个时间延迟后执行,或定期执行。
池内线程的数量可以通过一些因素来加以估算,如系统 CPU 的数量、物理内存的大小和并发客户请求数量的期望值等。更为高级的线程池架构可以根据使用模式动态调整池内线程数量。这类架构在系统负荷低时,提供了较小的池,从而减低内存消耗(如 Apple的大中央调度)。
Windows API 提供了与线程池有关的多个函数。使用线程池 API 类似于通过函数 Thread_Create() 来创建线程,参见《线程库》一节。这里,定义一个函数,以作为单独线程来运行。这样一个函数如下所示:
DWORD WINAPI PoolFunction(AVOID Param) { /* * this function runs as a separate thread. */ }PoolFunction() 的指针会被传给线程池 API 中的一个函数,池内的某个线程会执行该函数。线程池 API 的一个这种函数为 QueueUserWorkItem(),它需要三个参数:
- LPTHREAD START ROUTINE Function:作为一个单独线程来运行的函数的指针。
- PVOID Param:传递给 Function 的参数。
- ULONG Flags:标志,用于指示多线程池如何创建线程和管理线程执行。
调用这个函数的示例如下:
QueueUserWorkItem(&PoolFunction, NULL, 0);这让线程池的一个线程代替程序员来调用 PoolFunction()。这里,我们没有传递参数给 PoolFunction()。由于标志设为 0,因此针对线程池如何创建线程,没有特殊指令。
Windows 线程池 API 还包括可周期性地调用函数,或在一个异步 I/O 请求结束时调用函数。Java API 的
java.util.concurrent
也提供了线程池支持。所有教程
- socket
- Python基础教程
- C#教程
- MySQL函数
- MySQL
- C语言入门
- C语言专题
- C语言编译器
- C语言编程实例
- GCC编译器
- 数据结构
- C语言项目案例
- C++教程
- OpenCV
- Qt教程
- Unity 3D教程
- UE4
- STL
- Redis
- Android教程
- JavaScript
- PHP
- Mybatis
- Spring Cloud
- Maven
- vi命令
- Spring Boot
- Spring MVC
- Hibernate
- Linux
- Linux命令
- Shell脚本
- Java教程
- 设计模式
- Spring
- Servlet
- Struts2
- Java Swing
- JSP教程
- CSS教程
- TensorFlow
- 区块链
- Go语言教程
- Docker
- 编程笔记
- 资源下载
- 关于我们
- 汇编语言
- 大数据
- 云计算
- VIP视频