wait 和notify

wait()

          在其他线程调用此对象的 notify() 方法或 notifyAll() 方法前,导致当前线程等待。

notify()
          唤醒在此对象监视器上等待的单个线程。


package com.icss.biz.ppt;


/**
 * thinking in java p627
 * @author xiaohp
 *
 */
public class WaitTest {
public static void main(String[] args) {

Restaurant restaurant = new Restaurant();
Waiter waiter = new Waiter(restaurant);
waiter.start();
Chef chef = new Chef(restaurant,waiter);
chef.start();
}
}


class Restaurant {
public Order order;
}


class Order{
private static int i=0;
private int m_count;
public Order(){
m_count = i++;
if(m_count==10){
System.out.println("没有食物了,结束!");
System.exit(0);
}
}
}


class Waiter extends Thread
{
private Restaurant m_restaurant;

public Waiter(Restaurant r){
m_restaurant = r;
}

public void run() {
while(m_restaurant.order == null){
synchronized(this){
try {
System.out.println("Waiter线程id=" + Thread.currentThread().getId()+  "  等待中");
wait();                                     //等待通知,接到通知后才能向下运行
m_restaurant.order = null;
System.out.println("Waiter线程id=" + Thread.currentThread().getId()+  " 收到通知,取走订单 \n");
} catch (Exception e) {
}   
}
}
    }
}


class Chef extends Thread{
private Restaurant m_restaurant;
private Waiter m_waiter;
public Chef(Restaurant restaurant,Waiter waiter){
m_restaurant = restaurant;
m_waiter = waiter;
}
public void run(){
while(true){
if(m_restaurant.order == null){
m_restaurant.order = new Order();
System.out.println("厨师线程id=" + Thread.currentThread().getId() + ",接到新订单");

synchronized(m_waiter){
System.out.println("厨师线程id=" + Thread.currentThread().getId() + "----通知waiter取食物");
m_waiter.notify(); //通知waiter取食物
}

//下面的代码移到sychronized上面会出现死锁
try {
Thread.sleep(1000);
} catch (Exception e) {
}
}

}
}
}






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值