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