线程的交互-等待和唤醒

线程的等待:
(1)、void notify() 唤醒在此对象监视器上等待单个线程。
(2)、void notifyAll() 唤醒在次对象监视器上等待的所有线程。
线程的唤醒:
(1)、void wait() 导致当前线程等待,直到其它线程调用此对象的notify()和notifyAll()方法。
(2)、void wait(long timeout) 导致当前线程等待,直到其它线程调用此对象的notify()和notifyAll()方法,或者超过指定的时间量。
(3)、导致当前线程等待,直到其它线程调用此对象的notify()和notifyAll()方法,或者其它线程中断当前线程,或者超过指定的时间量。
注意事项:
notify()、notifyAll()和wait()方法等必须在线程同步的环境当中使用,notify()、notifyAll()和wait()方法都是Object的实例方法。

public class Thread_Wait_Notify {

    public static void main(String args[]){
        InsideThreadImpl_Wait_Notify insideThread=new InsideThreadImpl_Wait_Notify();
        insideThread.start();
        synchronized (insideThread){
            try {
                System.out.println("*************等待对象InsideThreadImpl计算完成**************");
                //等待
                insideThread.wait();
            }catch (Exception e){
                e.printStackTrace();
            }
            System.out.println("******************计算完成的总和:"+insideThread.total+"************************");
        }
    }
}

class InsideThreadImpl_Wait_Notify extends Thread{
    int total=0;
    @Override
    public void run() {
        synchronized (this){
            for (int i=0;i<101;i++){
                total+=i;
            }
            //唤醒线程
            notify();
        }
    }
}

注意:当在对象上调用wait()方法是,执行该代码的线程立即会释放该对象上的锁。当调用notify()的时候,并不会放弃对象的锁。

猜你喜欢

转载自blog.csdn.net/qq_24630433/article/details/88222317