线程池总结

线程池

1.优点

  1. 降低资源消耗(线程复用)
  2. 提高响应速度
  3. 可管理线程

2.自定义线程池

/**
 * @author 小毛同学
 * @version 1.0
 * @data 2022/3/12 8:12
 */
public class ThreadPoolExecutorDemo {
    public static void main(String[] args) {

        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(
                2,          //核心线程数
                4,      //最大线程数
                3,         //生存时间
                TimeUnit.SECONDS,      //时间单位
                new LinkedBlockingQueue<>(3),    //阻塞队列
                Executors.defaultThreadFactory(),        //线程工厂
                //拒绝策略
                //new ThreadPoolExecutor.AbortPolicy()    //抛出异常
                new ThreadPoolExecutor.CallerRunsPolicy()      //谁提交的任务谁执行
//                new ThreadPoolExecutor.DiscardPolicy()       //不抛出异常
//                new ThreadPoolExecutor.DiscardOldestPolicy()  //抛弃阻塞队列中最早的任务
                );

        try {
            for (int i = 1; i <= 100; i++) {
                threadPoolExecutor.execute(()->{
                    System.out.println(Thread.currentThread().getName()+"==>");
                });
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            threadPoolExecutor.shutdown();   //关闭线程
        }
    }
}

3.阻塞队列

ArrayBlockingQueue:基于数组结构的有界阻塞队列,按先进先出对元素进行排序。

LinkedBlockingQueue:基于链表结构的有界/无界阻塞队列,按先进先出对元素进行排序,吞吐量通常高于 ArrayBlockingQueue。Executors.newFixedThreadPool 使用了该队列。

SynchronousQueue:不是一个真正的队列,而是一种在线程之间移交的机制。要将一个元素放入 SynchronousQueue 中,必须有另一个线程正在等待接受这个元素。如果没有线程等待,并且线程池的当前大小小于最大值,那么线程池将创建一个线程,否则根据拒绝策略,这个任务将被拒绝。使用直接移交将更高效,因为任务会直接移交给执行它的线程,而不是被放在队列中,然后由工作线程从队列中提取任务。只有当线程池是无界的或者可以拒绝任务时,该队列才有实际价值。Executors.newCachedThreadPool使用了该队列。

PriorityBlockingQueue:具有优先级的无界队列,按优先级对元素进行排序。元素的优先级是通过自然顺序或 Comparator 来定义的。

4.拒绝策略

//new ThreadPoolExecutor.AbortPolicy()    //抛出异常
                new ThreadPoolExecutor.CallerRunsPolicy()      //谁提交的任务谁执行
//                new ThreadPoolExecutor.DiscardPolicy()       //不抛出异常
//                new ThreadPoolExecutor.DiscardOldestPolicy()  //抛弃阻塞队列中最早的任务

5. 执行流程

先使用核心线程池处理任务,多余的任务放入阻塞队列中,队列满后使用救急线程,当线程数达到最大线程数后,使用拒绝策略

6.如何合理的配置线程池的最大线程数?

先判断是CPU密集型还是IO密集型
   CPU密集型,设置线程数 = CPU数 + 1,通常能实现最优的利用率
      Runtime.getRuntime().availableProcessors()     //获取核数
   IO密集型,设置 线程数 = CPU数 * 2 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值