今天就来讲讲多线程通讯技术,在说这个之前,我要生活中的场景让大家整明白,闲扯淡几句,博主毕业之后去了几座城市,每个城市都有每个城市文化底蕴,也有每个地方人们所喜爱的生活方式,比如有的城市人们爱刷火锅,这个城市火锅店也是非常查之多,有的地方酒鬼特别多,大街小巷的小酒馆馆无处不在,但博主还是喜欢那座爱喝茶的城市,品茶香,知茶趣;品人生,知人趣。今天我以美女上茶这个案列详解多线程通讯技术送给大家,如有不好之处,望指正。
如上图所示,一个线程做写操作,一个线程做读操作。生产者生产一个,消费者消费一个。就相当于沏茶师傅沏好一杯茶,美女给端上来,让品茶客人喝。
上茶美女
@Data
public class BeautyWorman {/*** 美女名字*/public String name;}
沏茶师傅:
/*** 茶师傅沏茶*/
public class MakeTea implements Runnable{BeautyWorman beautyWorman;public MakeTea(BeautyWorman beautyWorman){this.beautyWorman = beautyWorman;}/****/@Overridepublic void run() {int count = 0;while (true) {synchronized (beautyWorman) {System.out.println("茶水以沏好,该让美女轮流上了!!!!!!!");if (count == 0) {beautyWorman.name = "苏小小";} else {beautyWorman.name = "柳如是";}count = (count + 1) % 2;}}}}
品茶人:
public class DrinkTea implements Runnable{BeautyWorman beautyWorman;public DrinkTea(BeautyWorman beautyWorman){this.beautyWorman = beautyWorman;}@Overridepublic void run() {while (true){synchronized (beautyWorman){System.out.println(beautyWorman.name+"大美人上的茶老香了,好喝好喝!!!!!");}}} }
测试下:
public static void main(String[] args) {BeautyWorman beautyWorman = new BeautyWorman();MakeTea makeTea = new MakeTea(beautyWorman);DrinkTea drinkTea = new DrinkTea(beautyWorman);new Thread(makeTea).start();new Thread(drinkTea).start();}
程序打印结果很明显不是我想要的,我们想要的结果是生产者生产一个,消费者消费一个,也就是茶师傅沏好一杯茶,品茶人喝一杯,现在全乱套了,沏茶的一直在沏茶,喝茶的一直在喝茶。
那么如何解决了:java为我们提供了两个api wait notify;多个线程实现通讯。
Wait:会让当前的线程变为阻塞状态,放弃cpu执行权,同时会释放锁。必须要在同步代码块中使用,且必须要通过对象锁this.wait。
为什么wait需要释放锁:目的就是为了能够让生产者写数据,防止死锁。
Notify:唤醒锁池阻塞的线程,从就绪到运行状态。
来:我们来改造上面的程序:
如果共享对象的flag值为false情况下,则只能写不能读;说明美女手里没茶,需要先让沏茶师傅沏好茶
如果共享对象的flag值为true的情况下,则只能读,不能写。说明美女手上有茶,可以让客人品茶
我们来改造下代码。
@Data
public class BeautyWorman {/*** 名字*/public String name;/*** 美女手上是否有茶,默认是没茶的*/public boolean flag = false;}
/*** 茶师傅沏茶*/
public class MakeTea implements Runnable{BeautyWorman beautyWorman;public MakeTea(BeautyWorman beautyWorman){this.beautyWorman = beautyWorman;}/****/@Overridepublic void run() {int count = 0;while (true) {synchronized (beautyWorman) {if(beautyWorman.flag){try {beautyWorman.wait();}catch (Exception e){e.printStackTrace();}}System.out.println("茶水以沏好,该让美女轮流上了!!!!!!!");if (count == 0) {beautyWorman.name = "苏小小";} else {beautyWorman.name = "柳如是";}count = (count + 1) % 2;beautyWorman.flag = ify();;}}}}
public class DrinkTea implements Runnable{BeautyWorman beautyWorman;public DrinkTea(BeautyWorman beautyWorman){this.beautyWorman = beautyWorman;}@Overridepublic void run() {while (true){synchronized (beautyWorman){if(!beautyWorman.flag){try {beautyWorman.wait();}catch (Exception e){e.printStackTrace();}}System.out.println(beautyWorman.name+"大美人上的茶老香了,好喝好喝!!!!!");beautyWorman.flag = ify();}}}
}
打印下:
漂亮!!!
本文发布于:2024-01-29 14:09:37,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170650858115830.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |