• java wait(),notify(),notifyAll()


    1. wait()的作用是使当前执行代码的线程进行等待,此方法是Object类的方法,该方法用来将当前线程置入“预执行队列”中,并且在wait()所带的代码处停止执行,直到接到通知或被中断位置。在调用wait()方法前线程必须获得该对象的对象级别锁,即只能在同步方法或同步块中调用wait()方法。
    2. notify()也要在同步方法或同步块中调用,即在调用前,线程也必须获得该对象的对象级别锁。该方法用来通知那些可能等待该对象的对象锁的其他线程,如果有多个线程等待,则由线程规划器随机挑选出其中一个wait状态的线程,对其发出notify通知。在执行notify()方法后,当前线程不会马上释放该对象锁,呈wait状态的线程也并不能马上获取该对象锁,要等到执行notify()方法的线程将程序执行完,也就是退出synchronized代码块后才会释放锁。
    3. notifyAll()方法是唤醒全部线程。
    4. wait(long) 带一个参数的方法是等待某一时间内是否有线程对锁进行唤醒,如果超过这个时间则自动唤醒.

    实例代码:

    package com.test;
    
    public class MyThread1 extends Thread {
        private Object lock;
        public MyThread1(Object lock) {
            this.lock = lock;
        }
        
        @Override
        public void run() {
            try {
                synchronized (lock) {
                    System.out.println("开始  wait time=" + System.currentTimeMillis());
                    lock.wait();
                    System.out.println("结束  wait time=" + System.currentTimeMillis());
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    package com.test;
    
    public class MyThread2 extends Thread {
        private Object lock;
        public MyThread2(Object lock) {
            this.lock = lock;
        }
        
        @Override
        public void run() {
            synchronized (lock) {
                System.out.println("开始 notify time=" + System.currentTimeMillis());
                lock.notify();
                System.out.println("结束 notify time=" + System.currentTimeMillis());
            }
        }
    }
    package com.test;
    
    public class Run {
        
        public static void main(String[] args) {
            
            try {
                Object lock = new Object();
                MyThread1 t1 = new MyThread1(lock);
                t1.start();
                Thread.sleep(3000);
                MyThread2 t2 = new MyThread2(lock);
                t2.start();
                    
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    运行结果:
    开始  wait time=1527763145089
    开始 notify time=1527763148090
    结束 notify time=1527763148090
    结束  wait time=1527763148090
  • 相关阅读:
    【转】ASP.NET MVC 使用 FluentScheduler 定时器计划任务
    【转】prototype扩展的JavaScript常用函数库
    【转】JavaScript系列文章:自动类型转换
    【转】Open Live Writer 插件更新
    highcharts与highstock实例
    SQL SERVER数据类型与C#数据类型对照表
    Highcharts在IE中不能一次性正常显示的一种解决办法
    MIME类型大全
    几种工具反编译被编译好的DLL文件
    MySQL之数据库的操作
  • 原文地址:https://www.cnblogs.com/gouge/p/9118388.html
Copyright © 2020-2023  润新知