栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

理解线程池

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

理解线程池

线程池其实就是一种多线程处理形式,处理过程中可以将任务添加到队列中,然后在创建线程后自动启动这些任务。
优点:

  • 提高线程利用率
  • 提高程序的响应速度
  • 便于统一管理线程对象
  • 可以控制最大的并发数(线程池容量)

执行过程:任务进来时,先判断核心线程是否处于空闲状态,如果不是,核心线程就先就执行任务,如果核心线程已满,则判断任务队列是否有地方存放该任务,若果有,就将任务保存在任务队列中,等待执行,如果满了,在判断最大可容纳的线程数,如果没有超出这个数量,就创建非核心线程执行任务,如果超出了,就调用handler实现拒绝策略。

线程池的主要参数

构造方法:
public ThreadPoolExecutor(int corePoolSize, //核心线程数量
                              int maximumPoolSize,//     最大线程数
                              long keepAliveTime, //       最大空闲时间
                              TimeUnit unit,         //        时间单位
                              BlockingQueue workQueue,   //   任务队列
                              ThreadFactory threadFactory,    // 线程工厂
                              RejectedExecutionHandler handler  //  饱和处理机制
	) 
{ ... }
  • corePoolSize:线程池中的核心线程数量,核心线程,只是在没有用的时候,也不会被回收
  • maximumPoolSize:就是线程池中可以容纳的最大线程的数量
  • keepAliveTime:就是线程池中除了核心线程之外的其他的最长可以保留的时间,因为在线程池中,除了核心线程即使在无任务的情况下也不能被清除,其余的都是有存活时间的,意思就是非核心线程可以保留的最长的空闲时间
  • util:就是计算这个时间的一个单位
  • workQueue:就是等待队列,任务可以储存在任务队列中等待被执行,执行的是FIFIO原则(先进先出)
  • threadFactory:就是创建线程的线程工厂
  • handler:是一种拒绝策略,我们可以在线程池队列和线程已达到最大的情况下,再有新的任务到达,就必须要有一种办法来处理新来的任务。Java线程池中提供了以下四种策略:
    • AbortPolicy: 直接抛异常
    • CallerRunsPolicy:让调用者帮着跑这个任务
    • DiscardOldestPolicy:丢弃队列里最老的那个任务,执行当前任务
    • DiscardPolicy:不处理,直接扔掉

测试下,建个线程池的容量为5,核心线程数量为3,等待队列长度为3.

public class ThreadPoolTest {
    public static void main(String[] args) {
        ExecutorService executorService = new ThreadPoolExecutor(3, 5, 1L, TimeUnit.SECONDS, new ArrayBlockingQueue<>(3), new ThreadPoolExecutor.AbortPolicy());
        for (int i = 0; i < 8; i++) {
            executorService.execute(()->{
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println( Thread.currentThread().getName()+"正在执行");
            });
        }
    }
}
  1. 如果是三个任务,运行的是核心线程

  2. 如果是5个任务,这是还没有启动非核心线程

  3. 如果是8个任务,超过了核心线程和等待队列容量,这时候就有5个线程在执行

  4. 如果是9个,大于(线程池最大容量和队列长度之和),抛出异常

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/694050.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号