ThreadPoolExecutor线程池

news/2024/5/20 10:05:23 标签: java, juc

文章目录

  • 一、ThreadPool线程池状态
  • 二、ThreadPoolExecutor构造方法
  • 三、Executors
    • 3.1 固定大小线程池
    • 3.2 带缓冲线程池
    • 3.3 单线程线程池
  • 四、ThreadPoolExecutor
    • 4.1 execute(Runnable task)方法使用
    • 4.2 submit()方法
    • 4.3 invokeAll()
    • 4.4 invokeAny()
    • 4.5 shutdown()
    • 4.6 shutdownNow()
  • 总结


一、ThreadPool线程池状态

在这里插入图片描述
ThreadPoolExecutor使用int高3位来表示线程池状态,低29位表示线程数量

在这里插入图片描述
从数字上比较,TERMINATED>TIDYING>STOP>SHUTDOWN>RUNNING最高的1位是1是代表的是负数
这些信息存储在一个原子变量ctl中,目的是将线程池状态与线程个数合二为一,这样就可以用一次CAS原子操作进行赋值

c为旧值,ctlOf返回结果为新值

ctl.compareAndSet(c, ctlOf(targetState, workerCountOf(c))))

rs(running state)为高3位代表线程池状态 wc(worker count) 为低29位代表线程个数

private static int ctlOf(int rs,int wc){return rs | wc;}

二、ThreadPoolExecutor构造方法

java">public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue,
                              ThreadFactory threadFactory,
                              RejectedExecutionHandler handler)

ThreadPoolExecutor7大核心参数
corePoolSize:核心线程数目(最多保留的线程数)
maximumPoolSize:最大线程数目
keepAliveTime:生存时间(针对非核心线程)
unit:时间单位(针对非核心线程)
workQueue:阻塞队列
threadFactory:线程工厂
handler:拒接策略
非核心线程数=maximumPoolSize-corePoolSize

拒绝策略

  1. AbortPolicy:让调用者抛出RejectedException异常(默认拒绝策略)
  2. CallerRunsPolicy:让调用者运行任务
  3. DiscardPolicy:放弃本次任务
  4. DiscardOldestPolicy:放弃队列中最早的任务,本任务会取而代之

三、Executors

3.1 固定大小线程池

java">public static ExecutorService newFixedThreadPool(int nThreads) {
        return new ThreadPoolExecutor(nThreads, nThreads,
                                      0L, TimeUnit.MILLISECONDS,
                                      new LinkedBlockingQueue<Runnable>());
    }

特点

  1. 核心线程数=最大线程数,因此不需要超时时间
  2. 阻塞队列是无界的,可以放任意数量的任务

3.2 带缓冲线程池

java">public static ExecutorService newCachedThreadPool() {
        return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
                                      60L, TimeUnit.SECONDS,
                                      new SynchronousQueue<Runnable>());
    }

特点
1. 核心线程=0,最大线程数=Integer的最大值,非核心线程空闲的生存时间是60S
2. 全员都是非核心线程
3. 非核心线程可以无线创建
4. SynchronousQueue实现特点,它没有容量,没有线程来取是放不进去的(一手交钱,一手交货)

3.3 单线程线程池

java">public static ExecutorService newSingleThreadExecutor() {
        return new FinalizableDelegatedExecutorService
            (new ThreadPoolExecutor(1, 1,
                                    0L, TimeUnit.MILLISECONDS,
                                    new LinkedBlockingQueue<Runnable>()));
    }

区别

  1. 自己创建一个单线程串行执行任务,如果执行任务失败而终止那么没有任何补救措施,而线程池还会重新创建一个线程,保证线程池的工作

四、ThreadPoolExecutor

4.1 execute(Runnable task)方法使用

特点:execute(Runnable task)方法执行后不会返回结果,若我们执行完方法后需要结果进行运算则不适用

java">public static void main(String[] args) throws Exception{
        ExecutorService pool = Executors.newFixedThreadPool(1);
        //方式一
        pool.execute(new Runnable() {
            @Override
            public void run() {
                //执行的业务逻辑
            }
        });
        //方式二:使用lambda表达式简化
        pool.execute(() -> {
            //执行的业务逻辑
        });
    }

4.2 submit()方法

特点:我们执行完submit方法后可以将处理结果进行返回

java">public static void main(String[] args) throws Exception{
        ExecutorService pool = Executors.newFixedThreadPool(1);
        //方式一
        Future<返回结果类型> taskResult=pool.submit(new Callable<返回结果类型>() {
            @Override
            public 返回结果类型 call() {
                //执行的业务逻辑,后将处理结果返回
                return null;
            }
        });
        //拿到返回的结果
        taskResult.get();
        
        //方式二:使用lambda表达式简化
        Future<返回结果类型> taskResult=pool.submit(() -> {
            //执行的业务逻辑
            return null;
        });
        //拿到返回的结果
        taskResult.get();
    }

4.3 invokeAll()

特点:执行任务以集合的方式,并且返回结果集合

java">public static void main(String[] args) throws Exception{
        ExecutorService pool = Executors.newFixedThreadPool(1);
        List<Future<Object>> tasks = pool.invokeAll(Arrays.asList(
                () -> {
	                //执行逻辑返回结果
                    return 1;
                },
                () -> {
                	//执行逻辑返回结果
                    return 2;
                }
        ));
        for (Future<Object> task : tasks) {
            System.out.println(task.get());
        }
    }

4.4 invokeAny()

特点:将任务集合中所有的任务进行执行,只返回第一个执行完毕的任务结果

java">Integer res = pool.invokeAny(Arrays.asList(
                () -> {
                    return 1;
                },
                () -> {
                    return 2;
                }
        ));
        System.out.println(res);

4.5 shutdown()

特点

  1. 将线程池状态变为SHUTDOWN
  • 不会接受新任务
  • 但已提交的任务会执行完
  • 此方法不会阻塞调用线程的执行

4.6 shutdownNow()

特点

  1. 线程池状态变为STOP
  • 不会接收新任务
  • 会将队列中的任务返回
  • 并用interrupt的方式终端正在执行的任务

总结


http://www.niftyadmin.cn/n/419825.html

相关文章

百度翻译API使用教程(前端+后端)

1.资格获取 首先我们需要登录百度翻译开放平台&#xff0c;获取开发者资格&#xff1a; 访问 百度翻译开放平台 然后进行注册&#xff08;如果有百度账号的话可以直接登录&#xff09; 注册成功后点击“产品服务”&#xff1a; 跳转到通用文本API界面&#xff1a; 在页面底…

【AI绘画】为小白准备的最简单本地部署安装使用教程——webui启动器

什么是AI绘画&#xff1f; ai绘画&#xff0c;也叫“ai作画”、“人工智能绘画”&#xff0c;即通过 AI 生成技术得到画作或图片。ai作画由来已久&#xff0c;有许多创作ai绘画作品的方式&#xff0c;包括基于规则的图像生成算法、深度学习算法。最近火爆全网的是通过文本描述…

uniapp和springboot微信小程序开发实战:后端架构搭建之封装WEB接口返回对象

文章目录 前言本节所需依赖工具类实现测试代码运行结果总结前言 作为开发者,开发的接口请求返回数据类型有很多种。比如返回字符串,返回对象,返回集合数组等情况,每个人开发者都有自己喜欢的方式或风格。所以在一个项目开发的时候架构师会定义好返回对象,给前端返回数据格…

HTTP超详细教程

1&#xff0c;HTTP协议 1.1&#xff0c;HTTP简述 HTTP全称为超文本传输协议&#xff0c;是一种应用比较广泛的应用层协议。 那何为超文本&#xff1f; 超文本指的是传输的内容不仅仅是文本&#xff0c;比如 html&#xff0c;css&#xff0c;javaScript 等数据&#xff0c;还…

springboot项目外卖管理 day05-新增与删除套餐

文章目录 一、新增菜品1.1、需求分析1.2、数据模型setmealsetmeal_dish 1.3、代码开发-梳理交互过程1.3.1、下拉框展示1.3.2、菜品窗口展示1.3.3、新增套餐 2、套餐分页查询 一、新增菜品 1.1、需求分析 套餐就是菜品的集合。 后台系统中可以管理套餐信息&#xff0c;通过新…

day52_Spring

今日内容 零、 复习昨日 一、Spring 零、 复习昨日 一、引言 以前 public class HelleServlet extends HttpServlet{UserService service new UsrServiceImpl();void doGet(){service.findUser();} }public interface UserService{User findUser(); } public class UserServ…

【华为OD统一考试B卷 | 200分】德州扑克(C++ Java JavaScript Python)

文章目录 题目描述输入描述输出描述用例C++javajavascriptpython题目描述 五张牌,每张牌由牌大小和花色组成,牌大小2~10、J、Q、K、A,牌花色为红桃、黑桃、梅花、方块四种花色之一。 判断牌型: 牌型1,同花顺:同一花色的顺子,如红桃2红桃3红桃4红桃5红桃6。 牌型2,四条…

ia write 自定义 导出模板

https://github.com/yangyang5214/github-plus.iatemplate 使用了点个 star 吧&#xff09; 在原有的 GitHub 模板基础上&#xff0c;增加了 封面页面和页脚。 封面页面 展示文章标题 作者 时间。高端大气&#xff5e; 增加页脚&#xff0c;显示 page/pageCount 加载 通过…