Sleep、Wait、Notify

192 阅读1分钟

public static native void sleep(long millis)
                  throws InterruptedException{sleep()是Thread的Static的方法,
因此他不能改变对象锁}

在指定的毫秒数内让当前正在执行的线程休眠(暂停执行), 
此操作受到系统计时器和调度程序精度和准确性的影响.该线程不丢失任何监视器的所属权

目的-->不让当前线程独自霸占该进程所获的CPU资源,留时间给其他线程执行的机会

public final native void wait(long timeout)
                throws InterruptedException{wait()是Object类里的方法}

其他线程调用此对象的notify()或notifyAll()方法,或者超过指定的时间量前,导致当前线程等待。
当前线程必须拥有此对象监视器{必须在synchronized block}

当执行wait()方法,就进入到一个与该对象相关的等待池中,同时释放了对象的锁


sleep 与 wait区别:
                                             sleep()方法休眠,保持对象锁; wait()方法休眠,释放对象锁


public final native void notify(){当前线程必须拥有此对象监视器}

唤醒在此对象监视器上等待的单个线程。如果多个线程都在此对象上等待,则会选择唤醒其中任意一个线程
直到当前线程放弃此对象上的锁定即执行完当前操作,才能继续执行被唤醒的线程

public class ThreadTest {    
    static byte[] obj = new byte[0];    
    public static void main(String[] args) throws InterruptedException {        
    new Thread(new Runnable() {            
        @Override            
        public void run() {                
            synchronized (obj) {                    
                try {                        
                        obj.wait();                    
                    } catch (InterruptedException e) {
                        e.printStackTrace();                    
                    }
                    System.out.println(Thread.currentThread().getName() 
                    + "---get lock");
                }
            }
        }).start();

       Thread.sleep(100); 
       new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (obj) {
                    obj.notify();
                    System.out.println(Thread.currentThread().getName() 
                    + "---execute notify method");
                }
                System.out.println(Thread.currentThread().getName() 
                    + "---release lock");
            }
        }).start();
     }
}