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)

大家都在看

  • Java容器相关知识点整理

    结合一些文章阅读源码后整理的Java容器常见知识点。对于一些代码细节,本文不展开来讲,有兴趣可以自行阅读参考文献。 思维导图 各个容器的知识点比较分散,没有在思维导图上体现,因此看…

    Java 2023年5月29日
    053
  • python 类与对象

    如果需创建一个类,那么可以使用 class 关键字:实例使用名为 a 的属性,创建一个名为 MyClass 的类: class MyClass: a = 6 现在我们可以使用名为 …

    Java 2023年6月9日
    047
  • Java LocalDateTime实用方法

    Java8提供了新的时间接口LocalDateTime。本文主要介绍了Java8中LocalDateTime的一些常用操作方法。不多说,直接上代码。欲知详情,可以看看官网。 Jav…

    Java 2023年6月8日
    070
  • 问题深究01——为什么不要在foreach循环里进行元素的remove/add操作?

    不要在foreach循环里进行元素的remove/add操作。 remove元素请使用Iterator方式,如果并发操作,需要对Iterator对象加锁。 正例 List list…

    Java 2023年6月8日
    0157
  • JavaSE笔记

    文末有Gitee链接,记得star哦课程整体内容概述 第一部分:编程语言核心结构主要知识点:变量、基本语法、分支、循环、数组、第二部分:Java面向对象的核心逻辑主要知识点:OOP…

    Java 2023年6月13日
    060
  • 戏说领域驱动设计(廿二)——聚合

    聚合的自白 大家好,我是聚合,在你们的期盼之下我终于出来了。其实早就想和大家见一面,不过作者每天总想着水流量,到现在才让我出来。他把实体和值对象这两个我家庭内的成员先介绍让我感觉非…

    Java 2023年6月7日
    052
  • [IM002]Navicat ODBC驱动器管理器 未发现数据源名称并且未指定默认驱动程序

    数据库 SQL SERVER 2008,连接时报:[IM002]Navicat ODBC驱动器管理器 未发现数据源名称并且未指定默认驱动程序 到安装目录下找到 sqlncli_x6…

    Java 2023年6月13日
    065
  • 商贸型企业 Java 收货 + 入库 + 生成付款单

    java;gutter:true; package cn.hybn.erp.modular.system.service.impl;</p> <p>impo…

    Java 2023年6月9日
    064
  • BOM

    BOM BOM(Browser Object Model) 是指浏览器对象模型,浏览器对象模型提供了独立于内容的、可以与浏览器窗口进行互动的对象结构。BOM由多个对象组成,其中代表…

    Java 2023年6月7日
    073
  • 面向对象ooDay3

    在派生类的构造方法中若没有调用超类的构造方法,则默认super()调用超类的无参构造方法 public class SuperDemo { public static void m…

    Java 2023年6月13日
    049
  • Mall谷粒商城(基础篇的开发)

    项目简介 Mall商城项目致力于打造一个完整的大型分布式架构的电商平台,采用先阶段流行的前后端分离模式编写。 Mall商城是一套电商项目,包括前台的商城系统以及后台管理系统,基于S…

    Java 2023年6月5日
    069
  • 记Mybatis动态sql

    写在前面:在此记录下项目中能够经常遇到的MyBatis动态SQL,因为经常容易忘,所以索性就给记录下来,免得每次都要百度搜索好久,需要使用的朋友自取,但是别忘了点赞哦💕 在此仅作部…

    Java 2023年6月14日
    071
  • Libgdx游戏开发(1)——环境配置及demo运行

    原文: Libgdx游戏学习(1)——环境配置及demo运行 – Stars-One的杂货小窝 Libgdx游戏是基于Java的一款游戏引擎,可以发布Android,桌…

    Java 2023年6月14日
    089
  • RabitMQ 发布确认

    每日一句 军人天生就舍弃了战斗的意义! 概述 RabitMQ 发布确认,保证消息在磁盘上。 前提条件 1。队列必须持久化 队列持久化 2。队列中的消息必须持久化 消息持久化 使用 …

    Java 2023年6月9日
    076
  • java-算法-排列组合

    package com.qinghuainvest.utils.algorithm; import java.util.ArrayList; import java.util.Ar…

    Java 2023年5月29日
    063
  • JAVA流程控制if、switch、while、do while、for、break、continue的用法及区别

    选择结构 if 选择结构 语法 if(布尔表达式) { //当布尔表达式为true将执行的语句 } if(布尔表达式) { //当布尔表达式为true将执行的语句 }else{ /…

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