JUC
2022-03-10 14:51:08 8 举报
AI智能生成
juc主要用法和案例
作者其他创作
大纲/内容
1、JUC是什么
java.util.concurrent
进程/线程回顾
1进程/线程是什么?
2 举例
3 线程状态
4 wait/sleep的区别
并发/并行
2、Lock接口
Synchronized
多线程编程模板上
1、线程 操作 资源类
2、高内聚低耦合
实现步骤
1、创建资源类
2、资源类里创建同步方法、同步代码块
买票例子
Lock
是什么
java.util.consurrent.locks.lock
Lock接口的实现类ReentrantLock可重入锁
如何使用
创建线程
继承Thread并重写run()方法——单继承,不行
new Thread(runnable,name)
买票例子
3、lambda表达式
函数式接口——只有一个抽象方法的接口
lamdba表达式
什么是lambda表达式
Lambda 表达写法:拷贝小括号(),写死右箭头->,落地大括号{}
4、线程间通信
两个线程轮流打印
例子NotifyWaitDemo
线程间通信:1、生产者+消费者 2、通知等待唤醒机制
多线程编程模板
1. 判断
2. 干活
3. 通知
Synchronized实现
代码
换成四个线程——防止线程虚假唤醒
5、线程间定制化通信
线程-操作-资源类
判断-干活-通知
例子:ThreeThreadInOrder
6、集合线程安全
传统集合线程不安全
ArrayList、HashMap插入、修改不加锁,多线程下修改丢失
HashTable、Vector通过Synchronized实现线程安全,但是已经过时
解决方法
Collections
Collections.synchronizedXXX()
写时复制 CopyOnWrite
7、 线程控制
CountDownLatch
等学生都走了,班主任关课室门
创建时需要指定state——new ConuntDownLatch(6)
countDownLatch.countDown() 让 state - 1
await()等待直到 state 为0
CountDownLatchDemo
CyclieBarrier
集齐一桌人开饭,再集齐一桌再开一桌
创建时需要指定一桌子的人数 parties 和开桌的行为 Runnable barrierCommand
cycclieBarrier.awit()方法让 barrierCommand 阻塞,直到人齐
barrierCommand 的方法由达到 parties 的线程执行,所以并不能确保人齐后一定执行开一桌,但是终究是会执行的
CyclieBarrierDemo
Semaphore
抢车位,控制固定数量的线程获取资源类,没拿到的等待,用完的让给别人
创建时需要指定资源数 permits
semaphonre.acquire() 方法会获取资源,使得 state - 1
semaphonre.release() 方法会释放信号量,使得 state + 1
SemaphoreDemo
8、线程池
阻塞队列 ArrayBlockingQueue
offer/poll过期不候,返回false
put/take 阻塞
add/remove 报错
Executors.newXXXXXThreadPool();
newFixedThreadPool 固定数量
newSingleThreadExecutor 单个线程
newCachedThreadPool 灵活数量
由于上面的创建方式并不灵活,所以不采用,正确方法如下
正确创建线程的方式
核心线程数——正常维持的线程数
最大线程数——最多会创建的线程数
空闲额外线程存活时间
时间单位
任务队列——核心线程干不完,就放到队列里,队列满了,就新增线程,线程已经满了,就使用拒绝策略
拒绝策略
DiscardOrdersPolicy——丢弃队列最前面的任务,接受新的任务
AbortPolicy——丢弃任务并抛出异常
CallerRunsPolicy——谁给我的任务,我还给谁
DiscardPolicy——默默丢弃,大家当无事发生
9、Stream流式计算
函数式接口
函数式接口@FunctionalInterface,类似@Override,用于语法检测。只能加在只有一个方法未被实现的接口上
四大内置核心函数式接口
Consumer<T> 消费型接口传入T类型参数,无返回值
Supplier<T> 供给型接口 无传参数,返回值T
Function<T,R> 函数型接口 接收T类型参数,返回 R 类型参数
Predicate<T> 传入 T 类型参数,返回 boolean 类型参数
10.AQS
0 条评论
下一页