【1】
【2】
package com.msb.test11; /** * @author : liu * 日期:15:42:06 * 描述:IntelliJ IDEA * 版本:1.0 */ public class Product {//商品类 //品牌 private String brand; //名字 private String name; //引入一个标记“灯”true 红色 false绿色 boolean flag=false; //默认情况下没有商品,让生产者先生产再消费 //setter,getter方法: public String getBrand() { return brand; } public void setBrand(String brand) { this.brand = brand; } public String getName() { return name; } public void setName(String name) { this.name = name; } //生产商品 public synchronized void setProduct(String brand ,String name){ if(flag==true){ try { //等待 wait(); } catch (InterruptedException e) { e.printStackTrace(); } } this.setBrand(brand); try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } this.setName(name); System.out.println("生产者生产了:"+this.getBrand() + "---"+ this.getName()); //生产完毕:灯变色 flag=true; //告诉消费者赶紧来消费 notify(); } //消费商品 public synchronized void getProduct(){ if (flag==false){//没有商品等待生产者生产 try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } //有商品,消费: System.out.println("消费者消费了:"+ this.getBrand()+"---"+ this.getName()); //消费完:灯变色 flag=false; //告诉生产者生产 notify(); } }
package com.msb.test11; /** * @author : liu * 日期:15:45:09 * 描述:IntelliJ IDEA * 版本:1.0 */ public class ProducerThread extends Thread{//生产者线程 //共享商品 private Product p; public ProducerThread(Product p) { this.p = p; } @Override public void run() { for (int i = 1; i <= 10; i++) {//生产十个商品 if (i%2==0){ p.setProduct("费列罗","巧克力"); }else{ p.setProduct("哈尔滨","啤酒"); } } } }
package com.msb.test11; /** * @author : liu * 日期:16:02:52 * 描述:IntelliJ IDEA * 版本:1.0 */ public class CustomerThread extends Thread{//消费者线程 //共享商品资源 private Product p; public CustomerThread(Product p) { this.p = p; } @Override public void run() { synchronized (p){ for (int i = 1; i <= 10 ; i++) {//消费次数 p.getProduct(); } } } }
【3】原理
注意wait(),notify()方法是必须放在同步代码快中的
标签:String,brand,通信,flag,分解,线程,void,public,name From: https://www.cnblogs.com/jeldp/p/17002003.html