2023/3/3 多线程&JUC(第一部分)

本文介绍了Java中的多线程实现方式,包括继承Thread、实现Runnable和使用Callable/Future。讨论了线程的生命周期、同步机制如同步代码块和同步方法,以及Lock锁的使用。文章还提到了避免死锁的策略和生产者消费者模式在阻塞队列中的应用。

多线程&JUC

一、线程

请添加图片描述

二、并发与并行

请添加图片描述

三、多线程的实现方式

请添加图片描述

1、继承Thread类的方式进行实现

请添加图片描述

2、实现Runnable接口的方式进行实现

注意此时需要通过Thread.currentThread()方法获取当前的线程然后再获取线程名

请添加图片描述

3、利用Callable接口和Future接口方式实现

请添加图片描述

4、三种实现方式的对比

前两种不能获取运行结果,但是第三种可以

请添加图片描述

四、线程的常见成员方法

请添加图片描述

1、如果是第一种方式实现的多线程,使用构造方法设置名字时,MyThread类中必须在构造方法中调用父类的构造方法进行命名

请添加图片描述

2、优先级线程只是一种概率,优先级大运行的概率大,并不是绝对的

3、当其他的非守护线程结束以后,守护线程会陆续的结束(不是突然结束,而是慢慢陆续结束,可能再运行一会儿)

4、礼让线程,表示当前的线程让出CPU的执行权,再次让所有线程进行抢占,可能还是当前线程再抢占到,所以也是一种概率,礼让后,该线程的运行概率会有所下降

5、插入线程,表示当前的线程被插入的线程插队,必须要插入线程完成之后才会继续执行当前的线程

五、线程的生命周期

请添加图片描述

六、同步代码块

请添加图片描述

请添加图片描述

1、注意同步代码块必须要在while循环的里面,否则当一个线程进入同步代码块时一定会将里面的内容执行完毕,也就是一个窗口卖完了所有的票

2、两个线程的锁必须是同一把锁,通常如上图中写锁

3、注意这里面的票必须要是静态的,这样才表示线程卖同样的一百张票,否则就是分别卖一百张了

七、同步方法

请添加图片描述

请添加图片描述

1、先写同步代码块,然后抽取出方法最简单

2、StringBuilder相比于StringBuffer而言,前者多线程不安全,后者都是同步方法,线程安全

八、lock锁

请添加图片描述

1、注意锁必须是惟一的

2、注意break最后跳出循环时可能会跳过解锁操作,所以通过try——catch中的finally来进行善后,保证最后一定解锁使程序结束

九、死锁

写代码的时候不要进行锁嵌套

十、生产者和消费者

请添加图片描述

常见方法

请添加图片描述
请添加图片描述
请添加图片描述

1、要创建一个共同的锁

2、注意等待的时候需要通过锁来等待,表示和这个锁绑定,从而方便后续的唤醒

3、唤醒只需要在刚吃完,或者刚做完的时候即可覆盖所有的情况,不要重复

4、唤醒需要使用锁,并且用notifyAll()方法唤醒所有与锁绑定的线程

十一、阻塞队列

请添加图片描述
请添加图片描述

1、注意此时输出语句是在锁的外面的,所以输出可能是乱的,但是程序本身没有错误

2、通过构造方法传递参数,从而保证为同一个阻塞队列

十二、线程六态

Java中没有运行态

请添加图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值