程序如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
public static void main(String[] args) throws  Exception{
    final List list = new ArrayList();
    final Object lock = new Object();
    Thread t1 = new Thread(new Runnable() {
        @Override
        public void run() {
            synchronized (lock){
                for(int i = 0 ; i < 10 ; i++){
                    list.add(i);
                    if(list.size() == 5){
                        lock.notify();
                        System.out.println(Thread.currentThread().getName() + "发出通知!");
                    }
                }
            }
            System.out.println(Thread.currentThread().getName() + "execute over!");
        }
    });
    Thread t2 = new Thread(new Runnable() {
        @Override
        public void run() {
            synchronized (lock){
                if(list.size() != 5){
                    try {
                        lock.wait();
                    catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                System.out.println(Thread.currentThread().getName() + " 收到通知!");
            }
            System.out.println(Thread.currentThread().getName() + "execute over!");
        }
    });
    t2.start();
    Thread.sleep(1000);
    t1.start();
}

分析:

程序的意图本是利用多线程之间的通信,利用wait/notify实现,可是运行的结果是虽然线程T1发出了通知,但是线程T2并没有立即收到通知进行执行,这是为什么呢? 因为只有线程T1执行完毕释放了锁,T2才能执行,那么也就是说wait/notify并不是实时的(wait释放了锁,而notify没有释放锁导致的),那么线程之间实时的通信该怎么做呢?可以利用CountDownLatch来实现。

对程序的改进:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
public static void main(String[] args) throws  Exception{
    final List list = new ArrayList();
    final Object lock = new Object();
    final CountDownLatch countDownLatch = new CountDownLatch(1);
    Thread t1 = new Thread(new Runnable() {
        @Override
        public void run() {
                for(int i = 0 ; i < 10 ; i++){
                    list.add(i);
                    if(list.size() == 5){
                        countDownLatch.countDown();
                        System.out.println(Thread.currentThread().getName() + "发出通知!");
                    }
                }
            System.out.println(Thread.currentThread().getName() + "execute over!");
        }
    });
    Thread t2 = new Thread(new Runnable() {
        @Override
        public void run() {
                if(list.size() != 5){
                    try {
                        countDownLatch.await();
                    catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                System.out.println(Thread.currentThread().getName() + " 收到通知!");
            }
            System.out.println(Thread.currentThread().getName() + "execute over!");
        }
    });
    t2.start();
    Thread.sleep(1000);
    t1.start();
}

本文转自zfz_linux_boy 51CTO博客,原文链接:http://blog.51cto.com/zhangfengzhe/1875221,如需转载请自行联系原作者

一道多线程通信实例分析相关推荐

  1. Android串口通信实例分析【附源码】

    Android 串口通信实例分析,用的时开源的android-serialport-api 这个是用android ndk实现的串口通信,我把他做了一个简化,适合于一般的程序的串口通信移植,欢迎拍砖- ...

  2. python socket通信 多进程_python实现多进程通信实例分析

    操作系统会为每一个创建的进程分配一个独立的地址空间,不同进程的地址空间是完全隔离的,因此如果不加其他的措施,他们完全感觉不到彼此的存在.那么进程之间怎么进行通信?他们之间的关联是怎样的?实现原理是什么 ...

  3. python多线程实战教程:python多进程通信实例分析

    操作系统会为每一个创建的进程分配一个独立的地址空间,不同进程的地址空间是完全隔离的,因此如果不加其他的措施,他们完全感觉不到彼此的存在.那么进程之间怎么进行通信?他们之间的关联是怎样的?实现原理是什么 ...

  4. python socket多线程 获取朋友列表_python socket多线程通讯实例分析(聊天室)

    本文实例讲述了python socket多线程通讯方法.分享给大家供大家参考,具体如下: #!/usr/bin/evn python """ 这是一个Socket+多进程 ...

  5. python进程socket通信_python实现多进程通信实例分析

    操作系统会为每一个创建的进程分配一个独立的地址空间,不同进程的地址空间是完全隔离的,因此如果不加其他的措施,他们完全感觉不到彼此的存在.那么进程之间怎么进行通信?他们之间的关联是怎样的?实现原理是什么 ...

  6. java 线程不安全例子_Java中多线程安全问题实例分析

    案例package com.duyang.thread.basic.basethread; /** * @author :jiaolian * @date :Created in 2020-12-16 ...

  7. python 多进程 每个进程做不同功能实例_python多进程通信实例分析

    操作系统会为每一个创建的进程分配一个独立的地址空间,不同进程的地址空间是完全隔离的,因此如果不加其他的措施,他们完全感觉不到彼此的存在.那么进程之间怎么进行通信?他们之间的关联是怎样的?实现原理是什么 ...

  8. android + javascript 相互通信实例分析

    1.  AndroidManifest.xml中必须使用许可 "android.permission.INTERNET", 否则会出Web page not available错误 ...

  9. python多线程数据交互_python 多线程 通信

    一篇文章搞定Python多进程(全) 公众号:pythonislover 前面写了三篇关于python多线程的文章,大概概况了多线程使用中的方法,文章链接如下: 一篇文章搞懂Python多线程简单实现 ...

最新文章

  1. 服务应该去版本化,不管是微服务还是SOA
  2. R语言ggplot2可视化:ggplot2可视化分组散点图并使用geom_smooth函数在散点图图中为不同的散点簇添加对应的回归曲线
  3. C#如何使用REST接口读写数据
  4. JAVA实现输入一个整数,输出该数二进制表示中1的个数(《剑指offer》)
  5. 打开正经图片,你可能会看到一张黄图,这种造假方法能同时骗过AI和人眼
  6. H3C批量收集服务器信息,H3C设备服务器采集参数认证过程(包含redfish和restfull协议)...
  7. 解决springBoot 的templates中html引入css文件失败
  8. Nucleic Acids Research | NONCODE数据库V6版发布,涵盖全面的动植物长非编码RNA注释
  9. android彻底关闭应用程序方法
  10. JAVA并发,线程异常捕获
  11. springcloud的中文文档地址和中国社区
  12. 多线程压测_京东618压测时自研中间件暴露出的问题,压测级别数十万/秒
  13. delphi模拟论坛登录
  14. 百度贴吧一键签到工具(android版)
  15. Chrome浏览器主页被hao123、360和2345篡改恢复到默认的方法
  16. 我喜欢的刀刀语录(一)
  17. ios12微信H5输入框软键盘关闭后,页面无法回到正常位置
  18. 我喜欢的LaTex编辑器
  19. MySQL 性能优化:8 种常见 SQL 错误用法!
  20. 淘宝商品详情APi接口(原数据APP、h5)

热门文章

  1. android 虚拟键盘改变单个按键颜色_这款机械键盘很特别!一亿次按键寿命还有高颜值...
  2. android 自动挂断,[转]android 来电自动接听和自动挂断
  3. php 获取警告信息,获取PHP警告错误信息的解决方法_PHP教程
  4. 《兔兔公司的历史》那些年,百度的荣耀和沉沦
  5. leetcode240. 搜索二维矩阵 II
  6. Redis:20---常用功能之(发布与订阅)
  7. (二)nodejs循序渐进-nodejs基本类型和循环条件语法篇(基础篇)
  8. nginx python webpy 配置安装
  9. NLP复习资料(3)-六~七章:马尔科夫模型与条件随机场、词法分析与词性标注
  10. c linux 判断ip合法_shell 检测ip的合法性与检测网络掩码的合法性