JUC常用类及线程池

juc常用类

  1. ConcurrentHashMap
  2. CopyOnWriteArrayList
  3. CopyOnWriteArraySet
  4. 辅助类 CountDownLatch

注意:

  • concurrentHashMap不允许put一个null值,这是为了消除歧义,我们无法确定在多线程环境下,null是由于key不存在还是本来就是null;

  • CopyOnWriteArrayList同时解决了ArrayList的线程不安全和vector读取的效率低的问题,vector对put和get都加了锁,在读取时显然效率低,因为我们只有对读加锁的需求;写写互斥,读写不互斥,CopyOnWriteArrayList在写操作的时候复制value对副本操作,操作完之后用新值更新value;

  • CopyOnWriteArraySet基于CopyOnWriteArrayList封装,不存储重复数据;

辅助类 CountDownLatch允许一个线程在执行若干线程后执行,基于AQS的state实现,锁的释放也是基于AQS的state的增减实现

import java.util.concurrent.CountDownLatch;

public class CountDownLatchDemo {

    public static void main(String[] args) throws InterruptedException {

        CountDownLatch countDownLatch = new CountDownLatch(6);//设置线程总量

        for (int i = 0; i <6 ; i++) {
           new Thread(()->{
               try {
                   Thread.sleep(1000);
               } catch (InterruptedException e) {
                   e.printStackTrace();
               }
               System.out.println("aaaaaaaaaaaaa");
               countDownLatch.countDown();
           }).start();
        }
        countDownLatch.await();

        System.out.println("main线程执行");//最后执行的内容

    }
}

线程池

线程池参数

  1. corePoolSize核心线程数
  2. maximumPoolSize最大线程数
  3. keepAliveTime最大存活时间
  4. unit时间单位
  5. workQueue阻塞队列
  6. threadFactory线程工厂
  7. handler拒绝策略

注意:

  1. 最大存活时间针对的是超过核心线程数的线程,这些线程在超过最大存活时间后终止

  2. 超过核心线程数的线程会先尝试进入阻塞队列,阻塞队列满后尝试进入非核心线程,如果非核心线程池也满那么会执行拒绝策略

  3. 拒绝策略有四种:

    1. DiscardPolicy 策略:直接丢弃不执行
    2. DiscardOleddestPolicy 策略:丢弃等待最久的线程
    3. CallerRunsPolicy 策略:让执行当前线程者执行如main
    4. AbortPolicy 策略:抛出异常
  4. 线程池有两种工作队列

    ArrayBlockingQueue:数组实现的阻塞队列满足fifo,需要手动设置长度

    LinkedBlockingQueue:链表实现的阻塞队列满足fifo,可选择指定长度

    execute和submit有什么区别?

    execute无返回值

    submit有返回值(future类)

    关闭线程池的两种方法

    shutdownNow:立刻关闭

    shutdown:不添加新任务,执行完当前的后关闭

流程图

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值