一道多线程通信实例分析

程序如下:

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,如需转载请自行联系原作者

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/454605.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

react native (一)

开始接触app方面的工作&#xff0c;真心塞~又开始了周而复始的死磕一个问题专坐一整天的节奏&#xff0c;关键是还没有成绩&#xff0c;实在无语。╮(╯▽╰)╭&#xff0c;还是总结一下最近心塞历程吧……react native中文网&#xff1a;http://reactnative.cn/docs/0.48/gett…

2台电脑一根网线传文件_「教程」如何快速的在两台电脑间传输大文件?

两台电脑如何传输文件我们常见的就是使用U盘或者网盘进行传输但是速度非常的慢我们需要一种文件可以直接复制到另一台设备的方法首先准备一根网线然后将两台电脑连接到同一局域网内在右下角的小电脑打开网络设置找到共享选项然后将公用文件夹共享开启在下面密码保护的共享中你可…

C语言信息系统贴吧,急 c语言学生信息管理系统

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼scanf("%s",s.name);printf("请输入学生的性别&#xff1a;");scanf("%s",s.sex);printf("请输入学生的班级&#xff1a;");scanf("%s",s.grade);printf("请输入学生的成绩…

Python 内置模块之 re

前言 输入一个手机号18333333333&#xff0c;你是怎么知道这串数字是手机号呢&#xff0c;假如现在你用python写一段代码&#xff0c;类似&#xff1a; phone_number input(please input your phone number&#xff1a;) 你怎么判断这个phone_number是合法的呢&#xff1f;…

mysqld_safe启动mysql

/home/data_mysql/mysql_3306/bin/mysqld_safe --defaults-file/home/data_mysql/mysql_3306/my.cnf --userroot & 原来的 /home/data_mysql/mysql_3306/bin/mysqld --defaults-file/home/data_mysql/mysql_3306/my.cnf --basedir/home/data_mysql/mysql_3306 --datadir/ho…

订阅内容解码失败(非base64码)_【火眼金睛】超强解码能力——邦纳全新ABR系列读码器来袭!...

点击关注▲ “邦纳”&#xff0c;开启智造之旅邦纳全新ABR系列读码器具有超强的解码能力&#xff0c;两种不同子系列产品&#xff0c;具有多重分辨率和镜头配置。从此读码不再是难题&#xff01;产品特点超强的解码能力使其可以读取困难的1D/2D码&#xff0c;包括DPM码和低对比…

程序员面试、算法研究、编程艺术、红黑树4大系列集锦与总结

程序员面试、算法研究、编程艺术、红黑树4大经典原创系列集锦与总结 作者&#xff1a;July--结构之法算法之道blog之博主。 时间&#xff1a;2010年10月-2011年6月。 出处&#xff1a;http://blog.csdn.net/v_JULY_v 。 声明&#xff1a;版权所有&#xff0c;侵犯必究。 前言 …

android中资源文件的两种访问方式,在android开发中进行数据存储与访问的多种方式介绍...

在android开发中进行数据存储与访问的多种方式介绍更新时间&#xff1a;2013年06月07日 16:24:23 作者&#xff1a;很多时候我们的软件需要对处理后的数据进行存储或再次访问&#xff0c;Android为数据存储提供了多种方式&#xff0c;首先给大家介绍使用文件如何对数据进行存…

MySQL5.6主从复制(读写分离)方案

MySQL5.6主从复制(读写分离)方案 https://yq.aliyun.com/articles/24255 摘要&#xff1a; 一、前言&#xff1a;为什么MySQL要做主从复制&#xff08;读写分离&#xff09;&#xff1f; 通俗来讲&#xff0c;如果对数据库的读和写都在同一个数据库服务器中操作&#xff0c;业务…

Python 内置模块之 os

os.walk os.walk() 方法是一个简单易用的文件、目录遍历器&#xff0c;可以帮助我们高效的处理文件、目录方面的事情。简单来说&#xff0c;就是挨个遍历指定路径下的目录&#xff08;文件夹&#xff09;和文件。用于通过在目录树中游走输出在目录中的目录名&#xff0c;文件名…

[arm驱动]linux内核时钟

《[arm驱动]linux内核时钟》涉及内核驱动函数四个&#xff0c;内核结构体一个&#xff0c;分析了内核驱动函数一个&#xff1b;可参考的相关应用程序模板或内核驱动模板一个&#xff0c;可参考的相关应用程序模板或内核驱动一个 一、内核定时器 意义:内核定时器是软件意义上…

企业网站 源码 服务邮箱:_公司企业邮箱购买,外贸企业邮箱用哪家服务好?

企业日常办公&#xff0c;经常会用到各种办公软件&#xff0c;而企业邮箱便是最常用的产品。公司在购买企业邮箱时需要考虑哪些方面&#xff0c;尤其是对于外贸行业的企业邮箱&#xff0c;应该如何选择呢&#xff1f;1. 安全保障公司企业邮箱购买时&#xff0c;首先要关注的就是…

微软公司等数据结构+算法面试100题2010版全部出炉

微软等公司数据结构算法面试100题2010版首次完整亮相 作者:July、2010年12月6日。 更新&#xff1a;现今&#xff0c;这100题的答案已经全部整理出来了&#xff0c;微软面试100题2010年版全部答案集锦&#xff1a;http://blog.csdn.net/v_july_v/arti…

android横竖屏切换布局闪退,Android-Activity横竖屏切换不杀死Activity 并监听横竖屏切换...

在上一篇博客&#xff0c;Android-Activity临时数据的保存&#xff0c;中讲解到&#xff0c;当发生横竖屏切换的时候&#xff0c;系统会杀死Activity并重新启动Activity系统会杀死Activity12-12 08:11:50.441 3347-3347/liudeli.activity D/TempDataActivity: onPause12-12 08:…

基于web的新闻发布系统_终极Linux系统ExTiX 19.8发布,基于深度操作系统deepin15.11...

近日&#xff0c;GNU/Linux开发人员Arne Exton发布了他的ExTiX 终极Linux系统的新版本&#xff0c;带有全新的底层和更新的组件。ExTiX Deepin 19.8基于Deepin Linux操作系统&#xff0c;更具体地说&#xff0c;ExTiX Deepin 19.8基于最新的Deepin 15.11版本&#xff0c;它增加…

Python 之内置函数和匿名函数

内置函数 截止到python3.6.2&#xff0c;python一共为我们提供了68个内置函数。它们就是python提供可以直接拿来使用的所有函数 Built-in Functions abs()dict()help()min()setattr()all()dir()hex()next()slice()any()divmod()id()object()sorted()ascii()enumerate()input(…

个人作业1

Deadline&#xff1a; 2017-9-30 10:00PM&#xff0c;以博客发表日期为准。 评分基准: 按时交 - 有分&#xff08;满分10分&#xff09;&#xff0c;检查的项目包括后文的三个方面 按题目要求完成个人博客注册、码云账号注册&#xff08;1分&#xff09;完成阅读作业和提问&…

“西邮漫记”--自由照耀中国

"西邮漫记"&#xff0d;&#xff0d;自由照耀中国九月初在北京linuxWorld大会上我遇见了久违的陈莉君教授&#xff0c;陈教授是西安邮电学院计算机系教授Linux内核的老师&#xff0c;上次相识是在广州参加广东Linux推进中心举办的“Linux文化节”&#xff0c;当时陈教…

numpy 是否为零_如果不懂 numpy,请别说自己是 python 程序员

(给Python开发者加星标&#xff0c;提升Python技能)作者&#xff1a;牧马人 (本文来自作者投稿)0. 前言大约七八年前&#xff0c;我曾经用 pyOpenGL 画过地球磁层顶的三维模型&#xff0c;这段代码至今仍然还运行在某科研机构里。在那之前&#xff0c;我一直觉得自己是一个合(y…

Python 第三方模块之 ElementTree(ET)- 解析XML文件

ElementTree是Python常用的处理XML文件的类。下面将介绍使用ElementTree解析、查找、修改XML的方法。 1、引用方法 import xml.etree.ElementTree as ET 2、一个XML例子 下面所有的操作都将下面这段XML为例&#xff0c;我们将它保存为sample.xml。 <?xml version"…