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......
wait ,notfiy 配合synchronized关键字使用,wait立即释放锁,而notify并不立即释放
最新推荐文章于 2021-11-13 15:57:14 发布