java基本的条件语句(Java并发编程之Object.wait)
java基本的条件语句(Java并发编程之Object.wait)解除所有那些在该对象上调用wait方法的线程的阻塞状态。该方法只能在同步方法或同步块内部调用。随机选择一个在该对象上调用wait方法的线程,解除其阻塞状态。该方法只能在同步方法或同步块内部调用。void wait(long millis)导致线程进入等待状态,对于等待时间更细粒度的控制,可以达到毫秒。在等待时间过去后就直接重新获取锁,往后执行;但是在竞争条件下,都会等获取到锁了才可以往下执行void wait(long millis int nanos)
wait、notify和notifyAll方法是Object类的final native方法,这些方法不能被子类重写,Object类是所有类的超类,所以每个类都有这三个方法。其中wait有三个重载方法。
void wait()导致线程进入等待状态,直到它被其他线程通过notify()或者notifyAll唤醒。该方法只能在同步方法中调用。这里wait与sleep方法不同,sleep方法只是停止当前进程,但是不会释放当前的锁,而wait会把当前的锁也释放。
wait
void wait(long millis)这里的参数是毫秒,也就是等待长达n毫秒,如果没有通知就超时返回。在等待时间过去后就直接重新获取锁,往后执行;但是在竞争条件下,都会等获取到锁了才可以往下执行
void wait(long millis)
void wait(long millis int nanos)导致线程进入等待状态,对于等待时间更细粒度的控制,可以达到毫秒。在等待时间过去后就直接重新获取锁,往后执行;但是在竞争条件下,都会等获取到锁了才可以往下执行
void wait(long millis int nanos)
void notify()随机选择一个在该对象上调用wait方法的线程,解除其阻塞状态。该方法只能在同步方法或同步块内部调用。
解除所有那些在该对象上调用wait方法的线程的阻塞状态。该方法只能在同步方法或同步块内部调用。
- 注意
由上面得出,Object.wait()和Object.notify()和Object.notifyall()必须写在synchronized方法内部或者synchronized块内部,这是因为:这几个方法要求当前正在运行object.wait()方法的线程拥有object的对象锁。即使你确实知道当前上下文线程确实拥有了对象锁,也不能将object.wait()这样的语句写在当前上下文中。如果当前线程不是锁的持有者,该方法抛出一个IllegalMonitorStateException异常。
接下里我们写个demo用例测试一下:
package com.consumer.test;
public class WaitTest {
public static void main(String[] args) {
Object object = new Object();
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("线程wait等待获取object锁");
synchronized (object) {
try {
System.out.println("线程wait获取了object锁");
// 会暂停进程但是不会释放锁
Thread.sleep(1000);
System.out.println("线程wait将要运行object.wait()方法进行等待");
object.wait();
System.out.println("线程wait得到通知。");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("线程notify等待获取object锁");
synchronized (object) {
System.out.println("线程notify获取了object锁");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("线程notify将要运行object.notify()方法进行通知");
object.notify();
}
}
}).start();
}
}
运行结果
我们从运行结果中发现notify方法通知后,wait发放接到通知开始向下继续运行,对于wait的俩个重载和notifyAll方法就不一一叙述,有兴趣的可以自己去敲敲看。
如有错误请指出,谢谢。