Java浅析wait方法

本文深入解析Java中wait方法的使用,包括其作用、参数解释及异常处理,通过实例演示如何让线程释放锁并进入阻塞状态,直至被唤醒。

wait方法的作用:让当前线程释放该对象的锁,并让当前线程阻塞。
有两种解除阻塞的途径:

  1. 指定最大阻塞时间
  2. 被其他线程调用notify/notifyAll方法唤醒

下面来看一下jdk的三个wait方法

    /**
     * 当前线程必须是该对象锁的拥有者
     *
     * @param timeout 要等待的最长时间 如果timeout为0,则必须被notify唤醒
     * @throws  IllegalArgumentException 如果超时值是负数,或者不在0-999999范围内
     * @throws  IllegalMonitorStateException 如果当前线程不是此对象锁的所有者
     * @throws  InterruptedException 如果当前线程等待通知之前或者正在等待通知时,任何线程中断了当前线程,抛出该异常并解除线程的中断状态
     */
	 public final native void wait(long timeout) throws InterruptedException;
	
	/**
     * @param timeout 毫秒
     * @param nanos 微毫秒
     */
	 public final void wait(long timeout, int nanos) throws InterruptedException {
	 	if (timeout < 0) {
	 		throw new IllegalArgumentException("timeout value is negative");
        }
        if (nanos < 0 || nanos > 999999) {
            throw new IllegalArgumentException(
                                "nanosecond timeout value out of range");
        }
        if (nanos > 0) {
            timeout++;
        }
        wait(timeout);
    }
    
    public final void wait() throws InterruptedException {
        wait(0);
	}

尤其注意的是wait()方法实则调用的是wait(0),当timeout为0时必须被notify/notifyAll方法唤醒。
下面用一段简单的代码观察一下wait的作用

class Lock {

}

class ThreadA extends Thread{
    Lock lock;
    public ThreadA(Lock lock) {
        this.lock = lock;
    }
    public void run() {
        synchronized (lock) {
            System.out.println("ThreadA线程:获得lock锁");
            System.out.println("ThreadA线程:执行结束释放lock锁");
        }
    }
}


class ThreadB extends Thread{
    Lock lock;
    public ThreadB(Lock lock) {
        this.lock = lock;
    }

    public void run() {
        synchronized (lock) {
            System.out.println("ThreadB线程:获得lock锁");
            System.out.println("ThreadB线程:执行结束释放锁");
        }
    }
}
public class waitTest {
    public static void main(String[] args) {
        Lock lock = new Lock();
        ThreadA threadA = new ThreadA(lock);
        ThreadB threadB = new ThreadB(lock);
        synchronized(lock) {
            try {
                System.out.println("主线程:启动threadA线程");
                threadA.start();
                System.out.println("主线程:启动threadB线程");
                threadB.start();

                System.out.println("主线程:此时lock锁在主线程这里");
                System.out.println("主线程:调用wait方法释放锁");
                lock.wait(1);

                System.out.println("主线程:wait方法结束,重新获得lock锁");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

执行结果

主线程:启动threadA线程
主线程:启动threadB线程
主线程:此时lock锁在主线程这里
主线程:调用wait方法释放锁
ThreadA线程:获得lock锁
ThreadA线程:执行结束释放lock锁
ThreadB线程:获得lock锁
ThreadB线程:执行结束释放锁
主线程:wait方法结束,重新获得lock锁
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值