zoukankan      html  css  js  c++  java
  • Object中的wait,notify,notifyAll基本使用(转)

    让线程停止运行/睡眠的方法只有两个:Thread.sleep()或者obj.wait()

    记住obj.nofity()并不能停止线程运行,因为notify虽然释放了锁,但依然会急促执行完synchronized块里面剩余的代码。

    只有obj.wait()才能停止线程运行。

    记住obj.nofity()并不能停止线程运行,因为notify虽然释放了锁,但依然会急促执行完synchronized块里面剩余的代码。

    只有obj.wait()才能停止线程运行。

    记住obj.nofity()并不能停止线程运行,因为notify虽然释放了锁,但依然会急促执行完synchronized块里面剩余的代码。

    只有obj.wait()才能停止线程运行。

     

     

    Object中的wait,notify,notifyAll基本使用

    Obj.wait(),与Obj.notify()必须要与synchronized(Obj)一起使用,也就是wait,与notify是针对已经获取了Obj锁进行操作,从语法角度来说就是Obj.wait(),Obj.notify必须在synchronized(Obj){…}语句块内。从功能上来说wait就是说线程在获取对象锁后,主动释放对象锁,同时本线程休眠。直到有其它线程调用对象的notify()唤醒该线程,才能继续获取对象锁,并继续执行。相应的notify()就是对对象锁的唤醒操作。但有一点需要注意的是notify()调用后,并不是马上就释放对象锁的,而是在相应的synchronized(){}语句块执行结束,自动释放锁后,JVM会在wait()对象锁的线程中随机选取一线程,赋予其对象锁,唤醒线程,继续执行。这样就提供了在线程间同步、唤醒的操作。Thread.sleep()与Object.wait()二者都可以暂停当前线程,释放CPU控制权,主要的区别在于Object.wait()在释放CPU同时,释放了对象锁的控制。

    object.wait()方法:让拥有object对象的锁的线程进入等待状态,并释放对象锁。

    object.wait()和object.notify()和object.notifyall()必须写在synchronized方法内部或者synchronized块内部,因为: 这几个方法要求当前正在运行object.wait()方法的线程拥有object的对象锁。

     从功能上来说wait就是说线程在获取对象锁后,主动释放对象锁,同时本线程休眠。直到有其它线程调用对象的notify()唤醒该线程,才能继续获取对象锁,并继续执行。

    从功能上来说wait就是说线程在获取对象锁后,主动释放对象锁,同时本线程休眠。直到有其它线程调用对象的notify()唤醒该线程,才能继续获取对象锁,并继续执行。

    从功能上来说wait就是说线程在获取对象锁后,主动释放对象锁,同时本线程休眠。直到有其它线程调用对象的notify()唤醒该线程,才能继续获取对象锁,并继续执行。

    线程休眠,就是线程停止执行,在所在行(释放锁的那一行,或者Thread.sleep()行,cpu就停止运行这个线程了) 

    线程休眠,就是线程停止执行,在所在行(释放锁的那一行,或者Thread.sleep()行,cpu就停止运行这个线程了) 

    线程休眠,就是线程停止执行,在所在行(释放锁的那一行,或者Thread.sleep()行,cpu就停止运行这个线程了) 

    wait就是我不用这个锁了,其他人来用吧

    notify是我马上就不用了,大喇叭广播下,谁马上

    是线程拥有某个对象的锁,是线程拥有某个对象的锁!

    是线程拥有某个对象的锁,是线程拥有某个对象的锁!

    是线程拥有某个对象的锁,是线程拥有某个对象的锁!

    是线程拥有某个对象的锁,是线程拥有某个对象的锁!

    (1)wait() 方法用来控制当前线程停止执行,等待其他线程对此Object实例调用notify或者notifyAll方法之后再继续执行 
    (2)wait(long timeout) 此方法的作用和wait()类似,但是增加了一个超时的设置,如果等待时间超过了timeout设定的毫秒数,那么当前线程会继续执行 
    (3)notify()方法从所有wait线程中选择一个线程,让它开始执行 
    (4)notifyAll()方法通知所有等待此对象的线程,开始执行

    package com.pingan.property.icore.pap.access.page;
    
    
    public class TestDemo {
    
        public static void main(String[] args) {
            Object lock = new Object();
            Thread thread1 = new Thread(new PrintA(lock));
            Thread thread2 = new Thread(new PrintB(lock));
            thread1.start();
            thread2.start();
            try {
                thread1.join();
                thread2.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    
    class PrintA implements Runnable {
        
        private Object lock;
    
        public PrintA(Object lock) {
            this.lock = lock;
        }
    
        @Override
        public void run() {
            for (int i = 1; i < 4; i++) {
                System.out.println("A" + i);
            }
            synchronized (lock) {
                lock.notifyAll();
            }
        }
    }
    
    class PrintB implements Runnable {
    
        private Object lock;
    
        public PrintB(Object lock) {
            this.lock = lock;
        }
    
        @Override
        public void run() {
            synchronized (lock) {
                try {
                    lock.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                for (int i = 4; i < 7; i++) {
                    System.out.println("B" + i);
                }
            }
    
        }
    }

    输出结果:

    A1
    A2
    A3
    B4
    B5
    B6

  • 相关阅读:
    bzoj1015星球大战(并查集+离线)
    bzoj1085骑士精神(搜索)
    bzoj1051受欢迎的牛(Tarjan)
    左偏树学习
    hdu1512 Monkey King(并查集,左偏堆)
    左偏树(模板)
    PAT (Basic Level) Practice (中文) 1079 延迟的回文数 (20分) (大数加法)
    PAT (Basic Level) Practice (中文) 1078 字符串压缩与解压 (20分) (字符转数字——栈存放)
    PAT (Basic Level) Practice (中文) 1077 互评成绩计算 (20分) (四舍五入保留整数)
    PAT (Basic Level) Practice (中文) 1076 Wifi密码 (15分)
  • 原文地址:https://www.cnblogs.com/panxuejun/p/7811058.html
Copyright © 2011-2022 走看看