java线程池的介绍与使用(Executor框架)

  1. 先来看一下类构成

java线程池的介绍与使用(Executor框架)
public interface Executor {   //顶级接口Executor,定义了线程执行的方法

    void execute(Runnable command);
}
public interface ExecutorService extends Executor {
  //定义了线程池周期相关的方法
    void shutdown();         //平缓的关闭:不再接受新的任务,同时等待已经提交的任务的完成(包括还未开始执行的任务)

    List shutdownNow();  //粗暴的关闭,尝试取消正在执行的任务,同时不再继续执行提交但未开始的任务

    boolean isShutdown();       //查看该执行器是否关闭

    boolean isTerminated();    //查询线程池是否终止

    boolean awaitTermination(long timeout, TimeUnit unit)  //等待线程池达到终止状态,通常在此方法后调用shutdown()达到同步关闭线程池的效果
        throws InterruptedException;

     Future submit(Callable task);              //submit()方法用来提交带有返回值的任务

     Future submit(Runnable task, T result);

    Future submit(Runnable task);

     List> invokeAll(Collectionextends Callable> tasks)    //用来提交复数的任务
        throws InterruptedException;

     List> invokeAll(Collectionextends Callable> tasks,
                                  long timeout, TimeUnit unit)
        throws InterruptedException;

     T invokeAny(Collectionextends Callable> tasks)
        throws InterruptedException, ExecutionException;

     T invokeAny(Collectionextends Callable> tasks,
                    long timeout, TimeUnit unit)
        throws InterruptedException, ExecutionException, TimeoutException;
}
  1. ThreadPoolExecutor为线程池的实现
public ThreadPoolExecutor(int corePoolSize,       //核心线程数量,代表在空闲状态下线程池中维持的线程的数量
                              int maximumPoolSize,   //线程池所能允许的最大线程数量
                              long keepAliveTime,  //空闲线程的存活时间
                              TimeUnit unit,    //时间单位
                              BlockingQueue workQueue,  //用来暂时保存任务的队列
                              ThreadFactory threadFactory,      //用来创建线程
                              RejectedExecutionHandler handler) {   //拒绝策略,在任务无法加入到队列是发挥作用

    }
  1. 拒绝策略

(1)AbortPolicy: 该策略抛出RejectedExecutionException,调用者捕获异常后进行处理。

(2)DiscartPolicy:当新任务无法加入到队列中是,该策略悄悄抛弃该任务。

(3)DiscardOldestPolicy:该策略将抛弃即将要执行的任务。

(4)CallerRunsPolicy:该策略将某些任务回退到调用者。

  1. 四种类型的线程池(通用线程池的方法定义在Executors类中)

当线程池的所有参数有效设置时提交任务的完整过程:查看当前线程数量是否大于corePoolSize,若小于则创建一个新的线程来执行该任务,否则将该任务加入到workQueue中;若workerQueue也满,那么查看线程的数量是否小于maximumPoolSize,若小于则创建新的线程来执行,否则执行抛弃策略。另外若线程空闲时间大于keepAliveTime,则销毁线程。

public ThreadPoolExecutor(int corePoolSize,            //通用构造方法
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue workQueue) {
        this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
             Executors.defaultThreadFactory(), defaultHandler);      //使用默认的线程工厂和默认的拒绝策略
    }
private static final RejectedExecutionHandler defaultHandler =        //默认为AbortPolicy    new AbortPolicy();

undefined

(1)newFixedThreadPool :创建一个固定大小的线程池

public static ExecutorService newFixedThreadPool(int nThreads) {
        return new ThreadPoolExecutor(nThreads, nThreads,       //核心数量=最大数量,keepAliveTime=0(若无以外线程将一直存在),workQueue使用LinkedBlockingQueue
                                      0L, TimeUnit.MILLISECONDS,
                                      new LinkedBlockingQueue());
    }
public static ExecutorService newFixedThreadPool(int nThreads, ThreadFactory threadFactory) {   //另一个构造方法,可指定线程工厂    return new ThreadPoolExecutor(nThreads, nThreads,                                  0L, TimeUnit.MILLISECONDS,                                  new LinkedBlockingQueue(),                                  threadFactory);}

undefined

undefined

(2)newCachedThreadPool:创建一个可更具需要的线程池

public static ExecutorService newCachedThreadPool() {
        return new ThreadPoolExecutor(0, Integer.MAX_VALUE,    //核心大小=0,最大数量不限,存活时间为60s(若长时间没有任务则该线程池为空),使用SynchronousQueue作为workeQueue
                                      60L, TimeUnit.SECONDS,
                                      new SynchronousQueue());
    }

(3)newScheduledThreadPool:创建一个可延迟执行任务的线程池

public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) {
        return new ScheduledThreadPoolExecutor(corePoolSize);
    }
public ScheduledThreadPoolExecutor(int corePoolSize) {
        super(corePoolSize, Integer.MAX_VALUE, 0, NANOSECONDS,   //指定核心大小,不限最大数量,线程不会过期,使用DelayedWordeQueue作为workeQueue
              new DelayedWorkQueue());
    }

(4)newSingleThreadPool:创建一个只有一个线程的线程池

public static ExecutorService newSingleThreadExecutor() {
        return new FinalizableDelegatedExecutorService
            (new ThreadPoolExecutor(1, 1,         //核心数量与最大数量都为1,存活时间不限,使用LinkedBlockingQueue作为workQueue
                                    0L, TimeUnit.MILLISECONDS,
                                    new LinkedBlockingQueue()));
    }

Original: https://www.cnblogs.com/liwangcai/p/11884690.html
Author: 神奇海螺。
Title: java线程池的介绍与使用(Executor框架)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/574162/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 【并发】ExecutorCompletionService使用

    介绍 ExecutorCompletionService是线程池和队列的配合使用,可以将线程池执行完成的结果存入队列当中,通过take或者poll方法获取执行完成的结果 遇到的场景…

    Java 2023年6月8日
    069
  • Java 基础(方法引用 Method References)

    当要传递给Lambda体的操作,已经有实现的方法了,可以使用方法引用! 方去引用可以看做是Lambda表达式深层次的表达。换句话说,方法引用就是Lambda表达式,也就是函数式接口…

    Java 2023年5月29日
    079
  • Java基础知识点整理(2021年最新版)

    看了网上很多关于Java基础知识点整理的文章,但是感觉都不是很好,要么不全面,要么不准确,要么排版太乱了,所以今天整理了一份Java基础知识点整理(2021年最新版),希望对大家有…

    Java 2023年5月29日
    059
  • 【Docker入门】Docker的常用命令

    了解和安装完docker之后,我们学习一下docker的常用命令就和当初学linux命令一样,放心命令其实大致相同只不过细节不同。 二、Docker镜像命令 各个选项说明: REP…

    Java 2023年6月13日
    072
  • 互联网最值得加入的 173 家国企汇总,真心强!!

    来源:www.zhihu.com/question/285730093/answer/2506491786 最近招人,拿的简历一沓一沓。 今年的就业形势,实在是严峻。社招都这样,更…

    Java 2023年6月15日
    086
  • [研究]SpringBoot-MybatisPlus-Dynamic(多数据源)

    特性 1. 支持 数据源分组 ,适用于多种场景 纯粹多库 读写分离 一主多从 混合模式。 2. 支持数据库敏感配置信息 加密 ENC()。 3. 支持每个数据库独立初始化表结构sc…

    Java 2023年6月9日
    077
  • pyton对Quoted-printable进行编码和解码

    前言 利用的是python的 quopri模块进行操作 一.加密 import quopri str = "你好世界" a = quopri.encodestr…

    Java 2023年6月13日
    0100
  • Spring5 简介与IOC核心

    Spring5 简介与IOC核心 1、Spring是一款轻量级的开源javaEE框架 2、Spring的作用:解决企业应用开发的复杂性 3、Spring的核心:IOC和Aop (1…

    Java 2023年6月7日
    084
  • Java学习-动手动脑2

    public void println() { newLine(); } /** * Prints a boolean and then terminate the line. T…

    Java 2023年6月9日
    070
  • 【Java面试】这也太卷了~面试竟然问,HTTP协议和RPC协议的区别

    “Http协议和RPC协议有什么区别?”最近很多人问我这个问题,他们都不知道怎么回答。今天我们就来了解一下这个问题的高手回答。另外,我把文字版本的内容整理到…

    Java 2023年6月16日
    086
  • Spring—Spring的AOP(三)

    1.1 什么是AOP AOP为Aspect Oriented Programming的缩写,是一种面向切面的编程,是基于动态代理的,对原有代码毫无入侵性,把和主业务无关的事情放到代…

    Java 2023年6月5日
    088
  • 不要使用Java Executors 提供的默认线程池

    参数定义 corePoolSize– 核心池大小。需要注意的是在初创建线程池时线程不会立即启动,直到有任务提交才开始启动线程并逐渐时线程数目达到corePoolSize…

    Java 2023年6月6日
    093
  • Java中的static关键字

    java中的static关键字1. 概述假设有一个学生类,它的数据成员有姓名、年龄、学号、教室,对于在同一个班的同学来讲,每个同学的姓名、年龄、学号或许都是不一样的,但是教室肯定是…

    Java 2023年5月29日
    070
  • Nginx 配置反向代理及负载均衡的实现

    一、nginx的反向代理及多台虚拟机负载均衡的实现 主机负载均衡服务器:192.168.232.132 的nginx.conf 配置如下 http { include mime.t…

    Java 2023年5月30日
    056
  • logback日志级别动态切换的终极方案(Java ASM使用)

    背景 一切皆有因果,所有事情,都有事件驱动。本方案的日志级别切换是由这样的背景下产生的: 单个生产环境上,有几百近千个微服务 日志级别切换不重启服务,要求即时生效果 由业务开发人员…

    Java 2023年6月6日
    077
  • 080_入门案例-fanout 发布订阅模式

    RabbitMQ的模式之发布订阅模式 生产者 消费者 RabbitMQ的模式之发布订阅模式 :::info参考官网:https://www.rabbitmq.com/getstar…

    Java 2023年6月7日
    0104
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球