JAVA -- 线程wait()、notify()、notifyAll()

来源:互联网 发布:网站seo查询 编辑:程序博客网 时间:2024/05/01 00:16

       这三个方法输入java.lang.Object

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

signal.wait()的意思并不是说,signal开始wait,而是说,运行这段代码的当前线程开始wait这个signal对象,即进入signal对象的待召(Waiting)队列。wait()还可以定义等待时间,当线程在某信号量的待召队列中,等到足够长的时间,就会等无可等,无需再等,自己就从待召队列转移到就绪队列中了

      2、notify():通知signal的待召队列中的某个线程如果某个线程等到了这个通知,那个线程就会转到就绪队列中但是本线程仍然继续拥有signal这个同步锁,本线程仍然继续执行 ,signal.notify()的意思。signal.notify()并不是通知signal这个对象本身。而是通知正在等待signal信号量的其他线程。

      3、notifyAll()通知待召队列里面的所有线程

必须从同步环境内调用wait()、notify()、notifyAll()方法。线程不能调用对象上等待或通知的方法,除非它拥有那个对象的锁。


       这三个方法可能出现的异常:
       java.lang.IllegalMonitorStateException:违法的监控状态异常。当某个线程试图等待一个自己并不拥有的对象(O)的监控器或者通知其他线程等待该对象(O)的监控器时,抛出该异常。

public class Calculator extends Thread {
    static int total;
    public void run() {
        for (int i = 0; i < 101; i++) {
            total ++;
        }
        //通知所有在此对象上等待的线程 ,不拥有当前对象的监控器,不能直接调用该方法
        notifyAll();
    }
}

        修改如下:

public class Calculator extends Thread {
    static int total;
    public void run() {
        synchronized(this){
        for (int i = 0; i < 101; i++) {
            total ++;
        }
        //通知所有在此对象上等待的线程
        notifyAll();
        }
    }

}


0 0
原创粉丝点击