juc常用类
- ConcurrentHashMap
- CopyOnWriteArrayList
- CopyOnWriteArraySet
- 辅助类 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线程执行");//最后执行的内容
}
}
线程池
线程池参数
- corePoolSize核心线程数
- maximumPoolSize最大线程数
- keepAliveTime最大存活时间
- unit时间单位
- workQueue阻塞队列
- threadFactory线程工厂
- handler拒绝策略
注意:
-
最大存活时间针对的是超过核心线程数的线程,这些线程在超过最大存活时间后终止
-
超过核心线程数的线程会先尝试进入阻塞队列,阻塞队列满后尝试进入非核心线程,如果非核心线程池也满那么会执行拒绝策略
-
拒绝策略有四种:
- DiscardPolicy 策略:直接丢弃不执行
- DiscardOleddestPolicy 策略:丢弃等待最久的线程
- CallerRunsPolicy 策略:让执行当前线程者执行如main
- AbortPolicy 策略:抛出异常
-
线程池有两种工作队列
ArrayBlockingQueue:数组实现的阻塞队列满足fifo,需要手动设置长度
LinkedBlockingQueue:链表实现的阻塞队列满足fifo,可选择指定长度
execute和submit有什么区别?
execute无返回值
submit有返回值(future类)
关闭线程池的两种方法
shutdownNow:立刻关闭
shutdown:不添加新任务,执行完当前的后关闭