Java - wait()/notify()

1、wait()惯用法:wait()包装在一个while语句中,因为某个其他任务可能会在WaitPerson被唤醒时,会突然插足并拿走订单;

2、只能在同步控制方法或同步控制块里调用wait()、notify()和notifyAll();

import java.util.concurrent.*;

public class Meal {
        private final int orderNum;
        public Meal(int orderNum){
            this.orderNum=orderNum;
        }
        public String toString(){
            return "Meal "+orderNum;
        }
}

public class Restaurant {
    Meal meal;
    ExecutorService exec=Executors.newCachedThreadPool();
    WaitPerson waitPerson=new WaitPerson(this);
    Chef chef=new Chef(this);

    public Restaurant(){
        exec.execute(waitPerson);
        exec.execute(chef);
    }
}

public class WaitPerson implements Runnable{

    private Restaurant restaurant;
    public  WaitPerson(Restaurant r) {
        restaurant=r;
    }

    @Override
    public void run() {
        try{
            while(!Thread.interrupted()){
                synchronized (this) {
                    while(restaurant.meal==null){
                        wait(); // for the chef to produce a meal
                    }
                }
                System.out.println("WaitPerson got "+restaurant.meal);

                synchronized(restaurant.chef){
                    restaurant.meal=null;
                    restaurant.chef.notifyAll();
                }
            }
        }catch(InterruptedException e){
            System.out.println("WaitPerson interrupted");
        }
    }
}

public class Chef implements Runnable {

    private Restaurant restaurant;
    private int count=0;
    public Chef(Restaurant r){
        restaurant=r;
    }

    @Override
    public void run() {
        try{
            while(!Thread.interrupted()){
                synchronized(this){
                    while(restaurant.meal!=null){
                        wait();
                    }
                }

                if(++count==10){
                    System.out.println("Out of food.closing");
                    restaurant.exec.shutdownNow();
                }

                System.out.print("Order up! ");

                synchronized(restaurant.waitPerson){
                    restaurant.meal=new Meal(count);
                    restaurant.waitPerson.notifyAll();
                }

                //TimeUnit.MILLISECONDS.sleep(100);
            }
        }catch(InterruptedException e){
            System.out.println("Chef interrupted");
        }
    }
}
时间: 2024-08-24 11:03:48

Java - wait()/notify()的相关文章

JAVA wait(), notify(),sleep详解

在JAVA中,是没有类似于PV操作.进程互斥等相关的方法的.JAVA的进程同步是通过synchronized()来实现的,需要说明的是,JAVA的synchronized()方法类似于操作系统概念中的互斥内存块,在JAVA中的Object类型中,都是带有一个内存锁的,在有线程获取该内存锁后,其它线程无法访问该内存,从而实现JAVA中简单的同步.互斥操作.明白这个原理,就能理解为什么synchronized(this)与synchronized(static XXX)的区别了,synchroniz

JAVA wait(), notify(),sleep具体解释

在CSDN开了博客后,一直也没在上面公布过文章,直到前一段时间与一位前辈的对话,才发现技术博客的重要,立志要把CSDN的博客建好.但一直没有找到好的开篇的主题,今天再看JAVA线程相互排斥.同步的时候又有了新的体会,就以他作为开篇吧. 在JAVA中,是没有类似于PV操作.进程相互排斥等相关的方法的.JAVA的进程同步是通过synchronized()来实现的,须要说明的是,JAVA的synchronized()方法类似于操作系统概念中的相互排斥内存块,在JAVA中的Object类型中,都是带有一

为什么 java wait/notify 必须与 synchronized 一起使用,jvm究竟做了些什么

这个课题提出来的是原先的线程并发解决的思路.目前解决线程并发,可以是lock接口结合condition  并发问题一直以来就是线程必不可少的话题. java 是第一个内置对多线程支持的主流编程语言.在Java5之前,对多线程的支持主要是通过对块结构的同步实现的(synchronized配合wait,notify,notifyAll),Java5引入了java.util.concurrent包,提供了对多线程编程的更高层的支持. 今天我们来说说.java中,线程提供我们解决并发.同步的方法 通常可

java wait(),notify(),notifyAll()的理解

这个三个函数来自Object类,众所周知它们是用于多线程同步的.然而,有个问题却一直没搞清楚,即notify()函数到底通知谁?<Thinking in JAVA>中有这么一句话,当notify()函数因为某个特定锁被调用时,只有等待这个锁的任务才会被唤醒.什么意思? 看下面的代码,这个代码执行的话会报错,java.lang.IllegalMonitorStateException 上网查了一下,明白了. 1>当前线程不含有当前对象的锁资源的时候,调用obj.wait()方法;2>

java—多线程—notify/notifyAll

notify应该使用在,只有两个线程在调用类中的两个方法,并在两个方法中进行互斥操作? 博客:Java多线程学习之wait.notify/notifyAll 详解 未完待续…… 原文地址:https://www.cnblogs.com/Tpf386/p/11185067.html

【转载】Java - Wait &amp; Notify

[本文转自]http://www.cnblogs.com/dolphin0520/p/3920385.html 这三个方法的文字描述可以知道以下几点信息: 1)wait().notify()和notifyAll()方法是本地方法,并且为final方法,无法被重写. 2)调用某个对象的wait()方法能让当前线程阻塞,并且当前线程必须拥有此对象的monitor(即锁) 3)调用某个对象的notify()方法能够唤醒一个正在等待这个对象的monitor的线程,如果有多个线程都在等待这个对象的moni

实践JAVA wait(), notify(),sleep方法--一道多线程的面试题

建立三个线程,A线程打印10次A,B线程打印10次B,C线程打印10次C,要求线程同时运行,交替打印10次ABC. 这个问题用Object的wait(),notify()就可以很方便的解决. public class MyThreadPrinter2 implements Runnable { private String name; private Object prev; private Object self; private MyThreadPrinter2(String name, O

java.lang.Object 的 wait 和 notify方法,及关键字 synchronized的作用

1. synchronized的作用 synchronized类似于win32中的临界区,临界区的作用:对于共享的全局变量,在多个线程并发的情况下,对这样的全局变量的读写就会发生读写的冲突, 使得全局变量的读写,能够以原子的方式被执行,而不是一个线程要读取全局数据时候,由于线程调度,而另一个线程则此时被唤醒,改变了这个全局变量的值, 这样使得读取的线程获得的数据不稳定,所以对于全局变量的读写的代码,我们要使用临界区使得这些代码原子化,此时只要在临界区中的代码,就会以原子方式执行, 而不会由于线程

Java线程经典面试题

53道Java线程面试题 下面是Java线程相关的热门面试题,你可以用它来好好准备面试. 1) 什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位.程序员可以通过它进行多处理器编程,你可以使用多线程对运算密集型任务提速.比如,如果一个线程完成一个任务要100毫秒,那么用十个线程完成改任务只需10毫秒.Java在语言层面对多线程提供了卓越的支持,它也是一个很好的卖点. 2) 线程和进程有什么区别? 线程是进程的子集,一个进程可以有很多线程,每条线程并