多线程之通讯技术

阅读: 评论:0

多线程之通讯技术

多线程之通讯技术

今天就来讲讲多线程通讯技术,在说这个之前,我要生活中的场景让大家整明白,闲扯淡几句,博主毕业之后去了几座城市,每个城市都有每个城市文化底蕴,也有每个地方人们所喜爱的生活方式,比如有的城市人们爱刷火锅,这个城市火锅店也是非常查之多,有的地方酒鬼特别多,大街小巷的小酒馆馆无处不在,但博主还是喜欢那座爱喝茶的城市,品茶香,知茶趣;品人生,知人趣。今天我以美女上茶这个案列详解多线程通讯技术送给大家,如有不好之处,望指正。

 如上图所示,一个线程做写操作,一个线程做读操作。生产者生产一个,消费者消费一个。就相当于沏茶师傅沏好一杯茶,美女给端上来,让品茶客人喝。

 上茶美女

@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 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23