IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Java线程池原理分析 -> 正文阅读

[Java知识库]Java线程池原理分析

1. Java线程池类的组织架构

  • Executor 最高级线程调度接口
    • ExecutorService 通用线程池接口
      • AbstractExecutorService
        • ThreadPoolExecutor – 线程池实现类
      • ScheduledExecutorService – 执行周期性任务的线程池实现类(不要用ExecutorService来引用)
      • Executors – 线程池创建的静态工厂类

2. 使用线程池静态工厂Executors创建线程池

  • Executors.newSingleThreadExecutor(); // 创建只有一个线程的线程池

  • Executors.newFixedThreadPool(10); // 创建固定数量线程的线程池

  • Executors.newCachedThreadPool(); // 创建线程数动态调整的线程池,线程缓存时间为60S,最多创建Integer.MAX_VALUE 个线程

  • Executors.newScheduledThreadPool(5); // 创建一个周期性执行任务的线程池,

3. 核心线程池的内部实现 ?

? 查看源代码可以发现Executors 工厂类创建线程池的方法都是对 ThreadPoolExecutor 类的包装。

ThreadPoolExecutor构造函数:

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

七个核心参数:

  • corePoolSize 核心线程数,即使线程空闲也不会回收
  • maximumPoolSize 最大线程数,线程池中可创建线程的上限
  • keepAliveTime 多余线程的存活时间
  • unit 存活时间的单位
  • workQueue 任务队列,存放被提交后等待执行的任务
  • threadFactory 线程工厂,用于创建线程,一般使用默认的
  • handler 拒绝策略,当太多任务来不及处理要如何拒绝任务

任务队列(BlockingQueue)的具体实现:

  • SynchronousQueue 直接提交的队列:总是将新的任务直接提交给线程执行,如果没有空闲线程则进行创建,如果达到了最大线程数量限制就执行拒绝策略。如果设定了最大线程数为Integer.MAX_VALUE可能会导致创建出大量的线程耗尽系统资源。

  • ArrayBlockingQueue 有界任务队列:若线程池实际线程数小于corePoolSize则会优先创建线程,若大于corePoolSize会将任务提交到队列中进行等待,若队列已满而且线程数小于最大线程数则创建新线程执行,否则执行拒绝策略。

  • LinkedBlockingQueue 无界任务队列:除非资源耗尽,否则任务可以一直入队,有造成OOM的可能。

  • PriorityBlockingQueue 优先任务队列:该队列会先执行优先级高的任务。


线程工厂:

可对创建的线程进行定制,一般使用默认即可,

ThreadFactory threadFactory = Executors.defaultThreadFactory();

拒绝策略: 四种

AbortPolicy: 直接抛出异常,阻止系统正常工作(默认拒绝策略)。

CallerRunsPolicy: 交给调用线程(提交任务的线程)来处理该任务。

DiscardOldestPolicy: 丢弃最老的一个任务,并尝试提交当前任务。

DiscardPolicy: 丢弃无法处理的任务,不会抛出任何异常。

4. 为什么不推荐使用Executors创建线程池?

  • Executors.newFixedThreadPool(10); 创建固定数量线程的线程池为例,他使用的是无界任务队列LinkedBlockingQueue,当过多的任务提交过来又处理不完时任务不断被存放到无界任务队列中会造成队列长度不断增加,最后可能会导致OOM异常。

  • newCachedThreadPool(); 创建动态数量线程的线程池为例,他在调用ThreadPoolExecutor创建线程池的时候将最大线程数设置为了Integer的最大值,当过多任务提交过来时可能会导致线程创建过多从而耗费了大量系统资源。

ps:推荐直接使用ThreadPoolExecutor类来直接创建线程池,让开发人员更了解线程池创建的核心参数。

5. 创建自定义线程池

public class CustomThreadPool {
    public static class Task implements Runnable {
        @Override
        public void run() {
            System.out.println(Thread.currentThread().getName());
        }
    }

    public static void main(String[] args) {
        Task task = new Task();
        // 创建自定义线程池
        // 无界任务队列:new LinkedBlockingQueue<>(10)
        // 默认线程创建工厂:Executors.defaultThreadFactory(),
        // 使用提供的抛出异常拒绝策略 new ThreadPoolExecutor.AbortPolicy()
        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(5, 10, 60L, TimeUnit.SECONDS,
                new LinkedBlockingQueue<>(10),
                Executors.defaultThreadFactory(),
                new ThreadPoolExecutor.AbortPolicy()
        );
        // 提交任务到线程池中进行执行
        threadPoolExecutor.submit(task);
        // 任务执行完毕关闭线程池
        threadPoolExecutor.shutdown();
    }

}

待补充:2021年10月23日23:10:14

  • 自定义线程工厂threadFactory
  • 自定义拒绝策略

参考《实战Java高并发程序设计》

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-10-24 14:48:21  更:2021-10-24 14:49:11 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 23:56:04-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码