一道多线程通信实例分析
程序如下:
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,如需转载请自行联系原作者
一道多线程通信实例分析相关推荐
- Android串口通信实例分析【附源码】
Android 串口通信实例分析,用的时开源的android-serialport-api 这个是用android ndk实现的串口通信,我把他做了一个简化,适合于一般的程序的串口通信移植,欢迎拍砖- ...
- python socket通信 多进程_python实现多进程通信实例分析
操作系统会为每一个创建的进程分配一个独立的地址空间,不同进程的地址空间是完全隔离的,因此如果不加其他的措施,他们完全感觉不到彼此的存在.那么进程之间怎么进行通信?他们之间的关联是怎样的?实现原理是什么 ...
- python多线程实战教程:python多进程通信实例分析
操作系统会为每一个创建的进程分配一个独立的地址空间,不同进程的地址空间是完全隔离的,因此如果不加其他的措施,他们完全感觉不到彼此的存在.那么进程之间怎么进行通信?他们之间的关联是怎样的?实现原理是什么 ...
- python socket多线程 获取朋友列表_python socket多线程通讯实例分析(聊天室)
本文实例讲述了python socket多线程通讯方法.分享给大家供大家参考,具体如下: #!/usr/bin/evn python """ 这是一个Socket+多进程 ...
- python进程socket通信_python实现多进程通信实例分析
操作系统会为每一个创建的进程分配一个独立的地址空间,不同进程的地址空间是完全隔离的,因此如果不加其他的措施,他们完全感觉不到彼此的存在.那么进程之间怎么进行通信?他们之间的关联是怎样的?实现原理是什么 ...
- java 线程不安全例子_Java中多线程安全问题实例分析
案例package com.duyang.thread.basic.basethread; /** * @author :jiaolian * @date :Created in 2020-12-16 ...
- python 多进程 每个进程做不同功能实例_python多进程通信实例分析
操作系统会为每一个创建的进程分配一个独立的地址空间,不同进程的地址空间是完全隔离的,因此如果不加其他的措施,他们完全感觉不到彼此的存在.那么进程之间怎么进行通信?他们之间的关联是怎样的?实现原理是什么 ...
- android + javascript 相互通信实例分析
1. AndroidManifest.xml中必须使用许可 "android.permission.INTERNET", 否则会出Web page not available错误 ...
- python多线程数据交互_python 多线程 通信
一篇文章搞定Python多进程(全) 公众号:pythonislover 前面写了三篇关于python多线程的文章,大概概况了多线程使用中的方法,文章链接如下: 一篇文章搞懂Python多线程简单实现 ...
最新文章
- 服务应该去版本化,不管是微服务还是SOA
- R语言ggplot2可视化:ggplot2可视化分组散点图并使用geom_smooth函数在散点图图中为不同的散点簇添加对应的回归曲线
- C#如何使用REST接口读写数据
- JAVA实现输入一个整数,输出该数二进制表示中1的个数(《剑指offer》)
- 打开正经图片,你可能会看到一张黄图,这种造假方法能同时骗过AI和人眼
- H3C批量收集服务器信息,H3C设备服务器采集参数认证过程(包含redfish和restfull协议)...
- 解决springBoot 的templates中html引入css文件失败
- Nucleic Acids Research | NONCODE数据库V6版发布,涵盖全面的动植物长非编码RNA注释
- android彻底关闭应用程序方法
- JAVA并发,线程异常捕获
- springcloud的中文文档地址和中国社区
- 多线程压测_京东618压测时自研中间件暴露出的问题,压测级别数十万/秒
- delphi模拟论坛登录
- 百度贴吧一键签到工具(android版)
- Chrome浏览器主页被hao123、360和2345篡改恢复到默认的方法
- 我喜欢的刀刀语录(一)
- ios12微信H5输入框软键盘关闭后,页面无法回到正常位置
- 我喜欢的LaTex编辑器
- MySQL 性能优化:8 种常见 SQL 错误用法!
- 淘宝商品详情APi接口(原数据APP、h5)
热门文章
- android 虚拟键盘改变单个按键颜色_这款机械键盘很特别!一亿次按键寿命还有高颜值...
- android 自动挂断,[转]android 来电自动接听和自动挂断
- php 获取警告信息,获取PHP警告错误信息的解决方法_PHP教程
- 《兔兔公司的历史》那些年,百度的荣耀和沉沦
- leetcode240. 搜索二维矩阵 II
- Redis:20---常用功能之(发布与订阅)
- (二)nodejs循序渐进-nodejs基本类型和循环条件语法篇(基础篇)
- nginx python webpy 配置安装
- NLP复习资料(3)-六~七章:马尔科夫模型与条件随机场、词法分析与词性标注
- c linux 判断ip合法_shell 检测ip的合法性与检测网络掩码的合法性