目录
一、前言
二、什么是线程
三、什么是线程池
四、线程池的优势
1、资源控制
2、减少开销
3、提高响应速度
4、统一管理
5、避免竞争
五、Java中的线程池
1、ExecutorService
2、ThreadPoolExecutor
3、ScheduledThreadPoolExecutor
六、线程池流程
1、创建线程池
2、提交任务
3、关闭线程池
七、线程池实例
八、总结
一、前言
在多线程编程中,线程的创建和销毁是消耗资源且具有一定开销的。为了更有效地管理线程的生命周期并提高多线程程序的性能,线程池成为了一个重要的概念。本文将介绍线程池的作用、优势以及如何使用线程池来优化多线程处理。
二、什么是线程
是操作系统能够进行运算调度的最小单位。(例如: cpu 对前端发往后端的一个请求的处理叫一个线程)
三、什么是线程池
线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池线程都是后台线程。每个线程都使用默认的堆栈大小,以默认的优先级运行,并处于多线程单元中。
四、线程池的优势
1、资源控制
线程池可以限制同时运行的线程数量,避免线程数量过多导致资源耗尽的情况。
2、减少开销
线程的创建和销毁开销较大,使用线程池可以避免频繁的线程创建和销毁,提高程序性能。
3、提高响应速度
线程池中的线程可以立即执行任务,减少了等待新线程创建的时间,提高了响应速度。
4、统一管理
线程池统一管理线程的状态、生命周期和资源,降低了线程管理的复杂性。
5、避免竞争
线程池可以有效避免线程间因资源竞争而导致的死锁和性能下降问题。
五、Java中的线程池
Java提供了java.util.concurrent
包来支持线程池的实现。
1、ExecutorService
线程池的基本接口,提供了提交任务、管理线程池等方法
2、ThreadPoolExecutor
ExecutorService
的默认实现,可根据需求定制线程池的参数。
3、ScheduledThreadPoolExecutor
用于定时任务的线程池。
六、线程池流程
1、创建线程池
使用Executors
类的工厂方法创建线程池,选择合适的线程池类型和参数。
2、提交任务
使用线程池的submit()
方法提交任务,线程池会自动选择一个空闲的线程执行任务。
3、关闭线程池
在程序结束时,记得关闭线程池,释放资源。
七、线程池实例
public class Client {
public static void main(String[] args) {
//实例化一个固定大小为10个线程的newFixedThreadPool线程池
ExecutorService executorService = Executors.newFixedThreadPool(80);
List<String> number = new ArrayList<>();
for(int i = 0 ; i <1000;i++){
number.add("多了"+i+"学习");
}
final CountDownLatch latch = new CountDownLatch(number.size());
//计算1000个学生的学习数据
for(int i = 0;i<number.size();i++){
//线程提交任务
executorService.submit(new Study(i,latch,number));
}
try{
//使调用该方法的主线程处于等待状态,当倒数到0时主线程才执行
latch.await();
} catch (InterruptedException e) {
throw new RuntimeException("王思琪学习如何学习多线程处理异常",e);
}
//关闭线程池
executorService.shutdown();
}
}
public class Study implements Runnable {
int studyNumber;
CountDownLatch latch;
List<String> number;
public Study(int studyNumber,CountDownLatch latch,List<String> number){
this.studyNumber=studyNumber;
this.latch=latch;
this.number=number;
}
private void start(){
//输出学生编号和执行该任务的线程名称
System.out.println("王思琪学了"+studyNumber+"次如何学习"+Thread.currentThread().getName());
}
@Override
public void run() {
//计算学生学习数据的方法
this.start();
//计数器容量减一
latch.countDown();
}
}
八、总结
线程池是一种优化多线程处理的重要技术,它通过管理线程的创建和销毁,提高了多线程程序的性能和响应速度。在多线程开发中,合理使用线程池可以有效地提升程序的效率和稳定性。