2022-8-4 第八组 曹雨
作者:互联网
LockSuppport工具类:(线程阻塞的工具类)
所有的方法都是静态方法,可以让线程在任何位置阻塞之后也有唤醒的方法。
park与parking:
如果我们把Thread看成一辆车,park就是把车停下,unpark就是让车开走。
public static void main(String[] args) throws InterruptedException {
Runnable runnable = () ->{
synchronized (OBJ){
System.out.println("线程"+Thread.currentThread().getName()+"正在执行");
LockSupport.park("我被阻塞了");
if (Thread.currentThread().isInterrupted()){
System.out.println("被中断了");
}
System.out.println("继续执行");
}
};
1、park不需要获取某个锁
2、因为中断park,不会抛出异常,需要在park之后自行判断中断状态,然后再做额外的处理
3、类似于wait,和notify,不能与他们交叉使用
4、他们两个不会涉及死锁
5、block的作用是看到对象的信息
Lock锁:
Lock lock = new Lock() {
@Override
public void lock() {
try {
//正常处理异常的解决方案
}catch (Exception e){
//出现异常的解决方案
} finally {
//手动释放锁
lock.unlock();
}
}
sychronized和Lock的区别:
Lock以下功能是synchronized不具备的!
ReentrantReadwriteLock :
对于一个应用而言,一般情况下读操作远远多于写的操作,如果仅仅是读的操作没有写的操作,数据又是线程安全,读写锁给我们提供了一种锁,读的时候可以很多线程一起读,但是不能有线程写,写是独占的,当有线程在执行写的操作,其他线程既不能读,也不能写。
并发编程三大特性:
- 原子性:原子操作可以是一个步骤,也可以是多个步骤,但是顺序不能乱也不可以被切割只执行其中的一部分,将整个操作视为一个整体。原子性不仅仅是多行代码,也可能是多条指令。
- 可见性:
- 有序性:
synchronized lock:可以保证原子性,可见性,有序性。
线程池:
为什么要创建线程池?
- 降低资源消耗
- 提高响应速度,任务到达时,不需要创建线程就能运行
- 提高线程的可管理性
JDk自带的四种线程池可通过Excutors提供的。
-
1、newcachedThreadPool:创建一个可缓存线程池,如果线程池长度超过处理需要,可以灵活回收空闲线程;若无可回收,则新创建线程
-
2、newFixedThreadPool:创建一个定长线程池,如果线程池的数量超过最大可并发数,则会在开始等待
-
3、newScheduledThreadPooL:创建一个定长线程池,支持定时及周期性执行任务
-
4、newsingleThreadExecutor:创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务都按照顺序执行。
四种线程的初始化都调用了同一种构造器:ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler)
参数的意义(重要):
- corePoolSize:线程池里线程的数量,核心线程池大小
- maximumPoolSize:指定了线程池里的最大线程数量
- keepAliveTime:当线程池线程数量大于corePoolSize,多出来的空闲线程,多长时间被销毁
- unit:时间单位
- workQueue:任务队列,用于存放提交但是尚未被执行的任务
- threadFactory:线程工厂,用来创建线程,线程工厂就是我们new线程的
- handler:拒绝策略,是将任务添加到线程池中时,线程池拒绝该任务多采取的相应的措施。
常见的工作队列:
- ArrayBlockingQueue:基于数组的有界阻塞队列。FIFO。
- LinkedBlockingQueue:基于链表的有界阻塞队列。FIFO
线程池提供了四种拒绝策略:
- AbortPolicy:直接抛出异常,默认的策略。
- CallerRunPolicy:用调用者所在的线程来执行任务
- DiscardOldestPolicy:丢弃阻塞队列中最靠前的任务,并执行当前任务
- DiscardPolicy:直接丢弃任务
重点掌握:
- 1.创建线程的4种方式*****
- 2.线程同步(synchronized,ReentrantLock,ReentrantReadWriteLock)*****
- 3.线程之间的通信(wait,notify,notifyAll)*****
- 4.线程类的常用方法***
指令重排,线程争抢,可见性,原子性,volatile关键字
总结:
多线程的学习,在今天结束了。感觉知识点很多,很杂。有关于锁的部分,在老师这几天的演示中,我看到了好多种锁的方式,感觉有些搞不清楚。对锁的理解也不是特别的透彻,只知道锁是为了让一个线程工作时,另一个线程不工作。但是具体的多种用法,搞得不是很清楚。
标签:曹雨,Lock,park,第八,阻塞,任务,线程,2022,创建 来源: https://www.cnblogs.com/figh466/p/16549779.html