JUC(java.util.concurrent)
2024-05-22 16:46:32 58 举报
AI智能生成
java.util.current 并发包
作者其他创作
大纲/内容
线程与进程: 线程是操作系统执行运算的最小单位,一个进程包含多个线程
并发: 同一时刻,多个线程竞争同一资源
并发: 多个线程并行执行
线程与进程, 并行与并发
【方式一】直接使用安全集合(Vector、Hashtable)
【方式二】使用 Collections 工具类转换
【方式三】使用JUC 下的安全集合(CopyOnWriteArrayList、CopyOnWriteArraySet、ConcurrentHashMap)
不安全集合
锁对象 & 锁模板类Class
Synchronized 内置的 Java 关键字, Lock 是一个 Java 接口
Synchronized 无法判断锁的状态, Lock 可以判断锁的状态
Synchronized 会自动释放锁, Lock 必须要手动释放锁! 如果不释放锁,就会出现死锁
Synchronized 线程1(获得锁 阻塞) 线程2(一直等待),Lock 锁就不一定会一直等下去
Synchronized 可重入锁,不可中断的,非公平; Lock 可重入锁,可以判断锁,非公平(默认是非公平,但可以自己设置)
Synchronized 适合少量的代码同步,Lock 适合锁大量的同步代码
Synchronized 和 Lock 区别
Synchronized 的8锁
高内聚低耦合前提下,线程操作资源类
判断——> 干活——> 通知
不能使用 if 判断 (虚假唤醒),要使用 while
【实现方式一】Synchronized + wait + notify
注意但,在调用 signal 方法时要先改变标志位
【实现方式二】Lock + Condition + awrite + signal
线程之间的通信
与 Runnable 接口对比, 有返回值,call 方法抛出异常
FutureTask 未来任务,只会执行一次
Callable 接口
指定先运行的线程数量,当这些线程运行完成,才会继续向下执行
线程中执行业务完成时,要调用 countDownLatch.countDown()
在指定数量的线程下面调用,countDownLatch.await(), 保证指定数量的线程先执行完成,才会继续向下执行
CountDownLatch(下课关门)
当线程执行业务代码完成时,调用 cyclicBarrier.await(),当计数器达到指定的数时,执行CyclicBarrier 对象中的 lambda 表达式
CyclicBarrier (召唤龙珠)
用于控制多线程的并发数和多个共享资源的互斥使用
acquire() 占用
release() 释放
Semaphore (争车位)
常用辅助类
ReadWriteLock 读写锁
ArrayBlockingQueue : 由数组结构组成的有界阻塞队列
LinkedBlockingQueue : 由链表结构组成的有界(但大小默认值为Integer.MAX_VALUE) 阻塞队列
PriorityBlockingQueue : 支持优先级排序的无界阻塞队列
DelayQueue : 使用优先级队列实现的延迟无界阻塞队列
SynchronousQueue : 不存储元素的阻塞队列,也既单个元素的队列
LinkedTransferQueue : 有链表组成的无界阻塞队列
LinkedBlockingDeque : 由链表组成的双向阻塞队列
阻塞队列七大实现
案例代码
BlockingQueue 的核心方法
BlockingQueue 阻塞队列
指定固定线程数
Executors.newFixedThreadPool(int)
单个
Executors.newSingleThreadExecutor()
可扩容
Executors.newCacheThreadPool()
使用 Executors 工具类
1、corePoolSize :线程池中的常驻核心线程数
Runtime.getRuntime().availableProcessors() 获取CUP 核数
cup 密集型 : cup 核数 +1
Io 密集型:判断程序中十分好资源的 IO 线程数, 只要设置比这个数大就行
2、maximumPoolSize : 线程池中能够容纳同时执行的数最大线程(此值必须大于等于1)
3、keepAliveTime : 多余的空闲线程的存活时间,当前线程池中线程数量超过corePoolSize 时,当空闲时间达到 keepAliveTime 时,多余线程会被销毁直到只剩下corePoolSize 个线程为止。
4、unit : keepAliveTime 的单位
5、workQueue : 任务队列,存放被提交但尚未被执行的任务
6、threadFactory : 便是生成线程池中工作线程的线程工厂,用于创建线程,一般默认即可
AbortPolicy(默认) :中断策略,直接抛出 RejectedExecutionException 异常
CallerRunsPolicy : 调用者运行, 该策略不会抛出异常,而是将拒绝的任务退回给调用者
DiscardPolicy : 抛弃无法处理的任务,不会抛出异常,
DiscardOldesPolicy : 抛弃队列中等待最久的任务,然后把当前任务加入到队列中,尝试再次提交当前任务
7、handler : 拒绝策略, 表示当队列满了,并且工作线程大于等于线程池的最大线程数(maximumPoolSize)时,如何来拒绝请求执行的策略
线程池几个重要参数
ThreadPoolExecutor 线程池
JUC(java.util.concurrent)
0 条评论
回复 删除
下一页