• 理解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 }
  • 相关阅读:
    转: MySQL 赋予用户权限(grant %-远程和localhost-本地区别)
    修改Apache的最大连接数
    正向代理与反向代理的区别【Nginx读书笔记】
    mysql加单引号和不加单引号的性能比较
    mysql保存数据提示1366 Incorrect string value: ‘xF0x9Fx98x8AxF0x9F…’ 解决
    Mysql外键约束设置使用方法
    MYSQL分库分表和不停机更改表结构
    Hive SQL 常用日期
    CountDownLatch学习
    Exchanger学习
  • 原文地址:https://www.cnblogs.com/hansongjiang/p/3859133.html
Copyright © 2020-2023  润新知