zoukankan      html  css  js  c++  java
  • 多线程9--- 线程间非实时通信--锁的wait与notify

    1.

     1 public class ListAdd1 {
     2     private volatile static List list = new ArrayList();
     3     
     4     public void add(){
     5         list.add("hello");
     6     }
     7     
     8     public int size(){
     9         return list.size();
    10     }
    11     
    12     public static void main(String[] args) {
    13         final ListAdd1 list1 = new ListAdd1();
    14         final Object lock = new Object();
    15         Thread t1 = new Thread(new Runnable() {
    16             @Override
    17             public void run() {
    18                 synchronized (lock) {//对象锁
    19                     try {
    20                         for (int i = 0; i < 10; i++) {
    21                             list1.add();
    22                             System.out.println(Thread.currentThread().getName()+"添加了一个元素...");
    23                             Thread.sleep(100);
    24                             
    25                             if(list1.size() == 5) {
    26                                 System.out.println("发出唤醒通知..");
    27                                 lock.notify();//不释放当前线程的锁lock, 当前线程继续执行
    28                             }
    29                         }
    30                     } catch (Exception e) {
    31                         e.printStackTrace();
    32                     }
    33                 }
    34                 
    35             }
    36         }, "t1");
    37         
    38         Thread t2 = new Thread(new Runnable() {
    39             @Override
    40             public void run() {
    41                 synchronized (lock) { //对象锁
    42                     if(list1.size() != 5){
    43                         try {
    44                             lock.wait(); //释放锁
    45                         } catch (InterruptedException e) {
    46                             e.printStackTrace();
    47                         }
    48                         System.out.println(Thread.currentThread().getName()+"线程停止");
    49                         throw new RuntimeException();
    50                     }
    51                 }
    52             }
    53         }, "t2");
    54         
    55         t2.start(); //先t2监听,不等于释放锁,被t1拿到,t1加到5发通知,继续等到执行完, t2开始执行!
    56         t1.start();
    57         
    58       /*t1添加了一个元素...
    59         t1添加了一个元素...
    60         t1添加了一个元素...
    61         t1添加了一个元素...
    62         t1添加了一个元素...
    63         发出唤醒通知..
    64         t1添加了一个元素...
    65         t1添加了一个元素...
    66         t1添加了一个元素...
    67         t1添加了一个元素...
    68         t1添加了一个元素...
    69         t2线程停止
    70         Exception in thread "t2" java.lang.RuntimeException
    71             at com.bjsxt.base.thread06.ListAdd1$2.run(ListAdd1.java:54)
    72             at java.lang.Thread.run(Thread.java:744)*/
    73     }
    74 }
    View Code
  • 相关阅读:
    服务端渲染
    node基础
    vue不同组件间的通信
    mui底部导航栏
    在mui中引入自定义的字体图标
    axios的使用
    vue多视图
    多元线性回归:波士顿房价预测问题TesnsorFlow实战
    MNIST手写数字识别:分类应用入门(实践篇)
    7-3 java高级 22_19寻找最大块的问题 (20 分)
  • 原文地址:https://www.cnblogs.com/bravolove/p/7944593.html
Copyright © 2011-2022 走看看