手撸一个简单的消费者与生产者多线程通信demo
package com.thread.exe;
import com.java.bean.Cake;
public class Demo2_thread {
public static void main(String[] args) {
/*
* 线程间的通信
* 等待-唤醒案例(敲代码) 生产者与消费者模型
* wait()和notify()方法必须要由同一个锁对象调用。因为,对应的锁对象可以通过notify唤醒使用同一个锁对象调用的wait()方法后的线程。
* wait方法与notify方法必须要在同步代码块或者是同步函数中使用
*/
Cake cake = new Cake();
Producer p = new Producer(cake);
Consumer c = new Consumer(cake);
p.start();
c.start();
}
}
class Producer extends Thread{
int count = 0;
private Cake c;
public Producer() {}
public Producer(Cake c) {
this.c = c;
}
@Override
public void run() {
while(true) {
synchronized (c) {
if(c.flag == false) {
try {
System.out.println("蛋糕制作中...");
Thread.sleep(2000);
if(count%2==0) {
c.setName("草莓");
c.setSize(15);
}else {
c.setName("蓝莓");
c.setSize(20);
}
count++;
c.flag = true;
c.notify(); //唤醒消费者线程
System.out.println(c.getName()+"口味" + c.getSize() + "尺寸" + "的蛋糕已由Producer制作好");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
try {
c.wait(); //生产者线程进入等待
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
class Consumer extends Thread{
private Cake c;
public Consumer() {}
public Consumer(Cake c) {
this.c = c;
}
@Override
public void run() {
while(true) {
synchronized (c) {
if(c.flag == false) {
try {
c.wait(); //消费者线程进入等待
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//消费者开始吃蛋糕,并修改状态
System.out.println("Consumer开始吃蛋糕" + c);
c.flag = false;
c.notify(); //唤醒生产者线程
}
}
}
}
资源类:
package com.java.bean;
public class Cake {
private String name;
private int size;
public static boolean flag = false;
public String getName() {
return name;
}
public Cake() {
}
public Cake(String name, int size) {
super();
this.name = name;
this.size = size;
}
public void setName(String name) {
this.name = name;
}
public int getSize() {
return size;
}
public void setSize(int size) {
this.size = size;
}
@Override
public String toString() {
return "Cake [口味=" + name + ", 尺寸=" + size + "]";
}
}
打印结果:
蛋糕制作中...
草莓口味15尺寸的蛋糕已由Producer制作好
Consumer开始吃蛋糕Cake [口味=草莓, 尺寸=15]
蛋糕制作中...
蓝莓口味20尺寸的蛋糕已由Producer制作好
Consumer开始吃蛋糕Cake [口味=蓝莓, 尺寸=20]
蛋糕制作中...
草莓口味15尺寸的蛋糕已由Producer制作好
Consumer开始吃蛋糕Cake [口味=草莓, 尺寸=15]