wait方法的作用:让当前线程释放该对象的锁,并让当前线程阻塞。
有两种解除阻塞的途径:
- 指定最大阻塞时间
- 被其他线程调用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锁
本文深入解析Java中wait方法的使用,包括其作用、参数解释及异常处理,通过实例演示如何让线程释放锁并进入阻塞状态,直至被唤醒。

1196

被折叠的 条评论
为什么被折叠?



