这种方式的实现,主要应对的场景是,生产者和消费者模式。
生产者 和 消费者,看成是两个线程,或者是多线程.
生产者 等待消费者把 把蛋糕吃掉,才能有盘子生产
消费者 等待生产者 生产蛋糕,才有蛋糕吃
啥都不说,直接把代码贴上来。模仿其他人的。
package com.luoy.Thread.wait;
import java.text.SimpleDateFormat;
import java.util.Date;
public class PlantBean{
public static void main(String[] args){
//使用共享变量 多线程才能实现
Plant p = new Plant();
new Thread(new GetCake(p)).start();
new Thread(new PutCake(p)).start();
}
}
class GetCake implements Runnable{
private Plant p;
public GetCake(Plant p){
this.p = p;
}
@Override
public void run(){
for(int i = 0; i < 10; i++){
//工作十次
p.getCakes();
}
}
}
class PutCake implements Runnable{
private Plant p;
public PutCake(Plant p){
this.p = p;
}
@Override
public void run(){
for(int i = 0; i < 10; i++){
//工作十次
p.putCakes();
}
}
}
class Plant{
//假设这是盘子对象
private static String plant = "";
//放蛋糕 操作
public synchronized void putCakes(){
while(!"".equalsIgnoreCase(plant)){
//当盘子 不是空的,就不能放蛋糕 等待
try{
wait();
}catch(InterruptedException e){
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//空的
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:sss");
//放入蛋糕
plant = "蛋糕-日期"+df.format(new Date());
try{
Thread.sleep(1000);
}catch(InterruptedException e){
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("放入:"+plant);
//通知等待中的线程- 取蛋糕出来
notify();
}
//取蛋糕
public synchronized void getCakes(){
while("".equalsIgnoreCase(plant)){
//当盘子是空的,不能取蛋糕 等待
try{
wait();
}catch(InterruptedException e){
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//盘子不为空 取蛋糕
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:sss");
//放入蛋糕
System.out.println("取走蛋糕:"+plant);
plant = "";
//通知等待中的线程- 放蛋糕
notify();
}
}