总结:线程池

前言:今天刚学完线程池,趁热打铁,复习巩固一下.

我会以三个内容进行总结:1.线程池的参数介绍,

2.线程池的工作流程.

3.使用Executors创建常见的线程池

1.线程池的参数介绍:

在标准库中有现成的线程池实现,重要的是理解它的参数:

ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,

BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory,

RejectedExecutionHandler handler)

1)corePoolSize:核心线程数

2)maximumPoolSize:最大线程数(包括核心线程和临时线程)

3)keepAliveTime:线程存活时间(临时线程允许摸鱼的最大时间)

4)unit:keepAliveTime的时间单位

5)workQueue:线程池要完成的任务队列,用于存放等待执行的任务(每个任务都通过Runnable来描 述

6)threadFactory:线程工厂,用于创建新的线程

7)handler:拒接策略

2.线程池的工作流程:

下面我们以一个简单的代码例子来了解线程池的工作流程:

java 复制代码
class MyFixedThreadPool{
//创建一个阻塞队列用于存储待执行的任务
  private BlockingQueue<Runnable> queue= new LinkedBlockingQueue<>();

// 构造函数,接收线程池大小作为参数
public MyFixedThreadPool(int n){
   // 创建n个工作线程
   for(int i=0;i<n;i++){
       Thread t = new Thread(()->{
           //每个线程要完成的工作,就是从队列中取出任务并执行
        try{
            while(true){
               // 从队列中获取任务,如果队列为空则阻塞等待
               Runnable task = queue.take();
               // 执行获取到的任务
                task.run();
            }
        }catch{InterruptedException e){
             // 处理线程中断异常
               e.printStackTrace();
       });
// 启动线程
  t.start();
 }
}        

// 向线程池提交任务的方法
public void submit(Runnable task) throws InterruptedException{
   //把任务添加到队列中,在队列满时会阻塞等待
queue.put(task);

public class Demo1{

public static void main(String[] args)throws InterruptedException{
// 创建一个包含4个线程的线程池
  MyFixedThreadPool threadPool = new MyFixedThreadPool(n:4);
// 提交10个任务到线程池
   for(int i=0;i<n;i++){
// 捕获循环变量i,确保在lambda表达式中使用正确的值
     int id=i;
     threadPool.submit(()->{
// 打印当前执行的任务ID,id会随着循环而发生变化
       System.out.println("执行任务:"+id);
     });
   }
 }
}

代码解析

这段代码实现了一个简单的固定大小线程池。线程池是一种常见的并发编程模式,它预先创建一定数量的线程,然后从任务队列中获取任务并执行,避免了频繁创建和销毁线程的开销。

工作流程:

提交任务 -> 任务进入队列 -> 工作线程从队列取任务 -> 执行任务 -> 循环获取新任务

^ |

| v

队列满则阻塞 执行完毕后继续获取

3.使用Executors创建常见的线程池:

java 复制代码
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;


public class demo4 {
    public static void main(String[] args) {
        //1.固定线程数目的线程池,核心线程数和最大线程数都为4(例)
ExecutorService service = Executors.newFixedThreadPool(4);
     //2.核心线程数设为0,最大线程数设为一个"Int 最大值"这样的线程
     ExecutorService service2 = Executors.newCachedThreadPool();
     //3.固定只有一个线程的线程池
     ExecutorService service3=Executors.newSingleThreadExecutor();
     //4.这个线程池本质上是"定时器",放到这个线程池中的任务,会在一定时间内执行
     ExecutorService service4=Executors.newScheduledThreadPool(10);
    }
}

常用的是1和2;

相关推荐
满怀冰雪8 分钟前
第04篇-双指针算法-从有序数组到回文判断的高频解法
java·算法
matlabgoodboy9 分钟前
计算机java程序代写python代码编写c/c++代做qt设计php开发matlab
java·c语言·python
leo__52015 分钟前
MATLAB实现牧羊人算法
开发语言·算法·matlab
伶俜6618 分钟前
零基础学 ArkUI 传感器(专题二):从加速度计到指南针,玩转硬件能力
学习·华为·harmonyos
视觉小萌新20 分钟前
C++利用libmicrohttpd制作交互网页端——C1
java·c++·交互
Gauss松鼠会22 分钟前
【GaussDB】GaussDB SMP特性调优详解
java·服务器·前端·数据库·sql·算法·gaussdb
进击的小头27 分钟前
第8篇:IGBT 从零到精通:核心原理、关键参数、选型指南与工业级应用要点
经验分享·嵌入式硬件·学习
格发许可优化管理系统29 分钟前
Mentor许可证使用规定全解析
java·大数据·c语言·开发语言·c++
郭庆汝29 分钟前
FastAPI使用笔记
笔记·fastapi
JAVA面经实录91733 分钟前
Redis 知识体系(完整版)
java·redis·nosql数据库·nosql