理解wait notify的好例子

 1 import java.util.concurrent.TimeUnit;

 2 

 3 

 4 public class Example2 {

 5 

 6     /**

 7      * @param args

 8      */

 9     public static void main(String[] args) {

10         // TODO Auto-generated method stub

11         final Object synObj = new Object();        

12         Thread t1 = new Thread(new Runnable() {

13             @Override

14             public void run() {

15                 synchronized(synObj) {

16                     System.out.println("1.T1获取synObj的对象监视器,开始执行同步块");

17                     try {

18                         TimeUnit.MINUTES.sleep(1);//休息一分钟,不放弃锁

19                         System.out.println("T1在 wait()时挂起了");

20                         synObj.wait();

21                         System.out.println("T1被T2唤醒后并重新获得synObj的对象监视器,继续执行");                        

22                     }catch(InterruptedException e) {

23                         e.printStackTrace();

24                     }

25                     System.out.println("T1获取synObj的对象监视器,结束同步块");

26                 }                

27             };

28         });

29         t1.start();

30 

31 

32         Thread t2 = new Thread(new Runnable() {

33             @Override

34             public void run() {

35                 System.out.println("T2启动,但是因为T1占用了synObj的对象监视器,则等待T1执行synObj.wait来释放它");

36                 synchronized(synObj) {

37                     try {

38                         System.out.println("在T1执行synObj.wait后,T2获取synObj的对象监视器,进入同步块");

39                         synObj.notify();

40                         System.out.println("T2执行synObj.notify(),T1被唤醒,但T2还在同步块中,没有释放synObj的对象监视器,T1等待synObj的对象监视器");

41                         TimeUnit.MINUTES.sleep(1);

42                         System.out.println("T2结束同步块,释放synObj的对象监视器,T1获取到synObj的对象监视器,并执行wait后面的操作");

43                     }catch(InterruptedException e) {

44                         e.printStackTrace();

45                     }

46                 }                

47             };

48         });

49         t2.start();

50         

51 

52     }

53 

54 }

你可能感兴趣的:(notify)