方法简介
1. wait()
synchronized (lockObjectA) {
try {
lockObjectA.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
此时,代码块中会释放对对象lockObjectA的锁定,同时使lockObjectA进行等待,直到有线程调用了它的notify()或notifyAll()方法,才继续将lockObjectA锁定,并继续执行下面程序。
即:调用任意对象的 wait() 方法导致该线程阻塞,该线程不可继续执行,并且该对象上的锁被释放。
2. notify()
synchronized (lockObjectA) {
lockObjectA.notify();
}
唤醒在等待该对象同步锁的线程(只唤醒一个),在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级。
即:调用任意对象的notify()方法则导致因调用该对象的 wait()方法而阻塞的线程中随机选择的一个解除阻塞(但要等到获得锁后才真正可执行)。
3. notifyAll()
将所有等待该对象的线程全部唤起。
示例
package Test0315;
/**
* Created by Cesar on 2016/3/15.
*/
public class TestWait extends Thread {
private static Object lockObjectA = new Object();
private int key;
public TestWait(int key) {
this.key = key;
}
@Override
public void run() {
if (key == 0) {
synchronized (lockObjectA) {
System.out.println(key + "开始等待");
try {
lockObjectA.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(key + "等待结束");
System.out.println(key + "成功锁定A");
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(key + "释放A");
} else if (key == 1) {
synchronized (lockObjectA) {
lockObjectA.notify();
}
System.out.println(key + "释放了A");
} else {
synchronized (lockObjectA){
System.out.println(3+"锁定了A");
}
}
}
public static void main(String[] args) {
TestWait wait = new TestWait(0);
wait.setName("Test Wait");
wait.start();
System.out.println("主线程休眠开始");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("主线程休眠结束,唤醒开始");
TestWait wait1 = new TestWait(1);
wait1.start();
TestWait wait2 = new TestWait(2);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
wait2.start();
try {
wait2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("全部结束");
}
}
结果
主线程休眠开始
0开始等待
主线程休眠结束,唤醒开始
1释放了A
0等待结束
0成功锁定A
0释放A
3锁定了A
全部结束
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。