7.wait/notify方法。

本文深入探讨Java中线程同步的重要机制,包括wait和notify方法的正确使用方式,以及它们与synchronized关键字的配合。通过具体代码示例,解释了如何在多线程环境中实现线程间的等待和唤醒,确保数据的一致性和线程的安全交互。
  1.    Waitnotify方法必须配合synchronized关键字使用。
  2.    Wait方法释放锁,notify方法不释放锁。
  3.  
  4. public class ListAdd1 {
  5.  
  6.   
  7.    private volatile static List list = new ArrayList(); 
  8.   
  9.    public void add(){
  10.       list.add("bjsxt");
  11.    }
  12.    public int size(){
  13.       return list.size();
  14.    }
  15.   
  16.    public static void main(String[] args) {
  17.       //1 实例化出来一个 lock
  18.       // 当使用wait notify 的时候 一定要配合着synchronized关键字去使用
  19.       final Object lock = new Object();
  20.      
  21.       final ListAdd1 list1 = new ListAdd1();
  22.      
  23.       Thread t1 = new Thread(new Runnable() {
  24.          @Override
  25.          public void run() {
  26.             try {
  27.                 synchronized(lock) {
  28.                 for(int i = 0; i <10; i++){
  29.                    list1.add();
  30.                    System.out.println("当前线程:" + Thread.currentThread().getName() + "添加了一个元素..");
  31.                    Thread.sleep(500);
  32.                    if(list1.size()==5) {
  33.                       System.out.println("已经发出通知");
  34.                       lock.notify();
  35.                    }
  36.                 }  }
  37.             } catch (InterruptedException e) {
  38.                 e.printStackTrace();
  39.             }
  40.          }
  41.       }, "t1");
  42.      
  43.       Thread t2 = new Thread(new Runnable() {
  44.          @Override
  45.          public void run() {
  46.             while(true){
  47.                 synchronized (lock) {
  48.                 if(list1.size() != 5){
  49.                    System.out.println("t2进入.....");
  50.                    try {
  51.                       lock.wait();
  52.                    } catch (InterruptedException e) {
  53.                       // TODO Auto-generated catch block
  54.                       e.printStackTrace();
  55.                    }
  56.                    System.out.println("当前线程收到通知:" + Thread.currentThread().getName() + " list size = 5 线程停止..");
  57.                    throw new RuntimeException();
  58.                 }
  59.                 }
  60.             }
  61.          }
  62.       }, "t2");   
  63.       t2.start();
  64.       t1.start();
  65.      
  66.    }
  67.   
  68.   
  69. }
  70. 输出结果:t2先执行,由于wait()方法会释放锁,交给t1执行,当t1添加了5个元素,向t2发出通知,调用notify()方法,notify方法不会释放锁,所以等t1执行完,t2在执行。
  71. t2进入.....
  72. 当前线程:t1添加了一个元素..
  73. 当前线程:t1添加了一个元素..
  74. 当前线程:t1添加了一个元素..
  75. 当前线程:t1添加了一个元素..
  76. 当前线程:t1添加了一个元素..
  77. 已经发出通知
  78. 当前线程:t1添加了一个元素..
  79. 当前线程:t1添加了一个元素..
  80. 当前线程:t1添加了一个元素..
  81. 当前线程:t1添加了一个元素..
  82. 当前线程:t1添加了一个元素..
  83. 当前线程收到通知:t2 list size = 5 线程停止..
  84. Exception in thread "t2" java.lang.RuntimeException
  85.    at com.bjsxt.base.conn008.ListAdd1$2.run(ListAdd1.java:59)
  86.    at java.lang.Thread.run(Thread.java:745)
  87.  
  88.  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值