概念:多个线程在处理同一个资源 但是处理的动作 (线程的任务)却不相同
比如:线程A用来生产包装的 线程B用来吃包子的 包子可以理解为同一资源 线程A于线程B处理的动作 一个是生产
一个是消费 那么线程A与线程B之间就存在线程通信问题
多个线程并发执行时 在默认情况下CPU是随机切换线程的 当我们需要多个线程来共同完成一件任务 并且我们希望他们由规律的执行 那么多线程之间需要一些协调通讯 以此来帮我们达到多线程共同操作一份数据
这是多个线程间的一种协作机制 线程我们想到的时线程间的竞争(race) 比如去争同步锁 但是者并不是故事的全部 线程间也会有协作机制
就是在一个线程进行了规定操作后 就进入等待状态 等待其他线程执行完他们的指定代码过后 再将其他线程执行完他们的指定代码过后 再将其他唤醒 再多个线程进行等待时 如果需要 可以使用
结束等待的三个方式
等待唤醒机制就是用于解决线程之间通信的问题 使用到的3个方法的含义如下:
方法notify()也要在同步方法或同步块中调用,该方法是用来通知那些可能等待该对象的对象锁的 其它线程,对其发出通知notify,并使它们重新获取该对象的对象锁。
如果有多个线程等待,则有线程调度器随机挑选出一个呈 wait 状态的线程。(并没有 "先来后到") 在notify()方法后,当前线程不会马上释放该对象锁,要等到执行notify()方法的线程将程序执行完,也就是退出同步代码块之后才会释放对象锁。
/*/线程共有资源对象---->包子*/
public class BaoZi {String Name;boolean flag;}
/** 消费者模型* */
public class ChiHuo extends Thread {BaoZi baoZi;//共享资源对象//定义构造方法:给线程定义名字,同时给Baozi对象赋值public ChiHuo(String threadName, BaoZi baoZi) {super(threadName);this.baoZi = baoZi;}/*/吃货线程功能:如果包子不存在 线程进入等待状态如果包子存在, 线程开始吃包子,吃完后更改包子的状态变为状态不存在,唤醒早餐店线程开始制作包子*/@Overridepublic void run() {//获取线程的名字String threadName = Thread.currentThread().getName();for (int i = 0; i < 10; i++) {synchronized (baoZi) {if (baoZi.flag) {//包子存在System.out.println(threadName + "正在吃" + baoZi.Name); //吃包子baoZi.flag = false;// 更改包子状态ify(); // 唤醒同一资源下的其他线程} else {// 包子不存在try {baoZi.wait();} catch (InterruptedException e) {e.printStackTrace();}}}}}
}
package 09;public class ZaoCanDian extends Thread {BaoZi baoZi;//资源对象//定义构造方法:给线程定义名字,同时给Baozi对象赋值public ZaoCanDian(String threadName, BaoZi baoZi) {super(threadName);this.baoZi = baoZi;}/** 早餐店县城功能:* 如果包子存在, 线程进入等待状态* 如果包子不存在, 线程开始制作包子,制作完成更改包子状态为存在,唤醒吃货线程吃包子* */@Overridepublic void run() {//获取线程的名字String threadName = Thread.currentThread().getName();for (int i = 0; i < 10; i++) {synchronized (baoZi) {if (baoZi.flag) {//包子存在try {baoZi.wait();} catch (InterruptedException e) {e.printStackTrace();}} else {//包子不存在System.out.println(threadName + "制作" + baoZi.Name);baoZi.flag = true;//更改包子状态ify();//唤醒同一个资源下的其他线程}}}}
}
package 09;public class ThreadText1 {public static void main(String[] args) {BaoZi baoZi=new BaoZi();baoZi.Name="韭菜鸡蛋盒子";baoZi.flag=false;ChiHuo chiHuo=new ChiHuo("猪八戒",baoZi);ZaoCanDian zaoCanDian=new ZaoCanDian("春光灿烂早餐店",baoZi);chiHuo.start();zaoCanDian.start();}
}
本文发布于:2024-02-04 12:55:21,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170707740255766.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |