自学线程之线程死锁与唤醒案例
2020-07-13 06:07
85 查看
package thead; public class Box { //定义一个成员变量,表示第x瓶奶 private int milk; //定义一个成员变量,表示奶箱的状态 private boolean state=false; //提供存储牛奶和获取牛奶的操作 public synchronized void put(int milk) { //如果有牛奶,等待消费 if(state) { try { wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } //如果没有牛奶生产牛奶 this.milk=milk; System.out.println("送奶工将第"+this.milk+"瓶奶放入奶箱"); //生产完毕之后,修改奶箱状态 state=true; //唤醒其他等待的线程 notifyAll(); } public synchronized void get() { //如果没有牛奶等待生产 if(!state) { try { wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } //如果有牛奶就消费牛奶 System.out.println("用户拿到第"+this.milk+"瓶奶"); //消费完毕,修改奶箱状态 state =false; //唤醒其他等待的线程 notifyAll();} } ```bash ```bash
package thead; public class Customer implements Runnable { private Box b; public Customer(Box b) { this.b=b; } @Override public void run() { while(true) { b.get(); } } }
package thead; public class BoxDemo { public static void main(String[] args) { // TODO Auto-generated method stub //创建奶箱对象,这里是共享数据区域 Box b=new Box(); //创建生产者对象作为构造方法参数传递,因为在这个类中要调用存储牛奶的操作 Producter p=new Producter(b); Customer c=new Customer(b); //创建两个线程对象,分别把生产者对象与消费者对象作为构造方法参数传递 Thread t1=new Thread(p); Thread t2=new Thread(c); t1.start(); t2.start(); } } `
package thead; public class Producter implements Runnable { private Box b; public Producter(Box b) { this.b = b; } public void run() { for (int i = 1; i <= 30; i++) { b.put(i); } } }
来自黑马教程
相关文章推荐
- 关于线程池、死锁、线程状态、等待与唤醒的问题,你觉得难吗???
- 使用Jvisualvm监控线程死锁案例分析
- 2016-08-19-java-关于线程的死锁的案例分析:生产者消费者问题
- 心得3--由售票系统中的抢票机制解说同步线程及死锁案例分析
- java线程基础巩固---多线程死锁分析,案例介绍
- C++ 线程的创建、挂起、唤醒和结束 &&&& 利用waitForSingleObject 函数陷入死锁的问题解决
- 自学Java第17天:异常与多线程:异常、线程实现方式、线程同步机制、等待唤醒机制、线程池、Lambda表达式
- 心得3--由售票系统中的抢票机制解说同步线程及死锁案例分析
- java中线程的同步和死锁案例分析
- JAVA笔记14__多线程共享数据(同步)/ 线程死锁 / 生产者与消费者应用案例 / 线程池
- day13【线程池、死锁、线程状态、等待与唤醒】synchronized关键字、线程池、死锁、线程状态、等待唤醒机制、定时器Timer
- java 线程 死锁(哲学家用餐案例讲解) -------thinking java 4
- GCD线程死锁解锁案例分析
- 线程死锁第五[自学笔记,大神绕路]
- Java多线程之死锁与线程间通信简单案例
- JAVA之旅(十四)——静态同步函数的锁是class对象,多线程的单例设计模式,死锁,线程中的通讯以及通讯所带来的安全隐患,等待唤醒机制
- JAVA之旅(十四)——静态同步函数的锁是class对象,多线程的单例设计模式,死锁,线程中的通讯以及通讯所带来的安全隐患,等待唤醒机制
- DllMain中不当操作导致死锁问题的分析--线程退出时产生了死锁
- [转帖]C++项目避免线程死锁的体会
- java自学-流程控制案例