public class Notify {
static Object ob = new Object();
public static void main(String[] args) {
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
try {
System.out.println("t1 start......");
synchronized (ob) {
System.out.println("t1 runing......");
Thread.sleep(100);
ob.wait();
System.out.println("t1 end......");
}
} catch (Exception e) {
e.printStackTrace();
}
}
});
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
try {
System.out.println("t2 start......");
synchronized (ob) {
System.out.println("t2 runing......");
ob.notify();
System.out.println("t2 end......");
}
} catch (Exception e) {
e.printStackTrace();
}
}
});
t1.start();
t2.start();
}
}
输出结果:t1 start......
t2 start......
t1 runing......
t2 runing......
t2 end...... t1 end......
// notify执行完毕后,t1才获得锁
但是如果需要notify通知后,t1线程立即执行时,则可以用java.util.concurrent.CountDownLatch类import java.util.concurrent.CountDownLatch;
public class Notify {
static Object ob = new Object();
public static void main(String[] args) {
final CountDownLatch countDownLatch = new CountDownLatch(1);
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
try {
System.out.println("t1 start......");
//synchronized (ob) {
System.out.println("t1 runing......");
countDownLatch.await();
System.out.println("t1 end......");
//}
} catch (Exception e) {
e.printStackTrace();
}
}
});
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
try {
System.out.println("t2 start......");
//synchronized (ob) {
System.out.println("t2 runing......");
//ob.notify();
countDownLatch.countDown();
System.out.println("t2 end......");
//}
} catch (Exception e) {
e.printStackTrace();
}
}
});
t1.start();
t2.start();
}
}
输出结果:
t2 start......
t1 start...... //等待。。。
t2 runing...... //通知等待线程
t1 runing......//t1获得通知,执行
t1 end......
t2 end......