java多线程:5 线程间通讯 --新公司入职,有点忙未完成
来源:互联网 发布:ip地址数据库 编辑:程序博客网 时间:2024/04/28 14:42
线程间的通讯:同一进程中不同线程之间的通讯。
通讯方式
线程之间的通讯方式主要有:1 共享变量;2 wait、notify()/notifyAll(),3 condition,lock,4 管道机制。
共享变量
共享变量:就是多个线程通过同一个变量,进行通信,你在这儿放个信息,我到时候去取,这样就完成了一次通信,当然这是简单的通讯。
package com.thread.communication;import java.util.Random;/**通过共享变量进行通讯,当已经完成的线程超过10个后,就启动特殊的线程。 或者指定的service执行完成,再执行特殊的线程。***/package com.thread.communication;import java.util.Random;/**通过共享变量进行通讯,注意这里的限制条件是:只要有5个线程完成了,特殊线程就可以执行了***/public class ShareVariable { public static void main(String[] args) { final Signal signal = new Signal(5); for(int i=0;i<20;i++){ new Thread(new Runnable() { public void run() { int i = new Random().nextInt(10000)+100; while((i--)>0); signal.complete(); } }).start(); } //特殊线程 new Thread(new Runnable() { public void run() { //循环判断已经执行的线程数是否满足 while(!signal.isComplete()); System.out.println(Thread.currentThread().getName()+" 终于可以干活了"); } }).start(); System.out.println("---------"); }}class Signal{ private int totalNum;//需要完成线程的数量 private int completeNum;//已经完成的线程数量 public Signal(int totalNum){ this.totalNum = totalNum; } public synchronized void complete(){ System.out.println(Thread.currentThread().getName()+" 完成工作 "+totalNum+","+completeNum); if(totalNum > completeNum){ completeNum++; } } public synchronized boolean isComplete(){ System.out.println(Thread.currentThread().getName()+"----"); return (totalNum == completeNum); }}输出:Thread-0 完成工作 5,0Thread-1 完成工作 5,1Thread-5 完成工作 5,2Thread-9 完成工作 5,3Thread-2 完成工作 5,4Thread-6 完成工作 5,5Thread-10----Thread-10 终于可以干活了Thread-4 完成工作 5,5Thread-8 完成工作 5,5Thread-3 完成工作 5,5Thread-7 完成工作 5,5从输出内容看:会发现特殊线程是第7个执行的,因为我们的条件是,只要有5个线程完成,特殊线程就可以执行了,注意这里是执行,并没有说特殊线程立刻执行,因为特殊线程还需要和其他线程进行锁的争夺,这次的输出应该是没有争取到。多执行几次,估计可以看到如下的输出:Thread-1 完成工作 5,0Thread-5 完成工作 5,1Thread-2 完成工作 5,2Thread-4 完成工作 5,3Thread-10----Thread-10----Thread-8 完成工作 5,4Thread-0 完成工作 5,5Thread-10----Thread-10 终于可以干活了Thread-6 完成工作 5,5Thread-9 完成工作 5,5Thread-3 完成工作 5,5会发现特殊线程执行了多次,但是只有当5个线程完成后,才会有机会执行特殊线程。如果要求特殊线程必须第6个执行,那么就需要严格的处理代码逻辑,1 totalNum和completeNum都需要volatile进行修改,同时普通线程执行的时候,如果是第6个执行的线程,就需要等待,让特殊线程优先执行。
wait、notify()/notifyAll()
通过系统提供的wait和notify机制进行线程之间的通信,主要是线程执行顺序的通讯,例如:当不符合条件的线程获取锁之后,就wait,直到其他线程唤醒,继续进行执行顺序的判断。
这里写代码片
阅读全文
0 0
- java多线程:5 线程间通讯 --新公司入职,有点忙未完成
- 新公司入职
- JAVA 多线程 线程间的通讯
- JAVA 多线程 线程间的通讯
- 多线程-线程间通讯
- java多线程:3、线程通讯
- java线程学习(四)—Java 多线程间的通讯
- 今天新公司入职,立此存照
- 到新公司入职了
- 多线程-线程间的通讯
- 多线程_线程间通讯
- Java Design Demo--多线程(二)线程间通讯
- JAVA中的线程——多线程间的通讯
- 黑马程序员笔记——Java多线程线程间通讯
- java多线程——线程间的通讯
- 黑马程序员——多线程--线程间的通讯及安全问题和JDK1.5的新特性
- java ----线程间通讯
- java线程间通讯
- Xcode 创建静态库封装自己的SDK
- begalebone上的debian系统装opencv
- 推荐一个代做毕业设计的网站
- Centos之命令搜索命令whereis与which
- Java方法区、栈及堆
- java多线程:5 线程间通讯 --新公司入职,有点忙未完成
- 快递查询
- UCGUI学习之路(6)键值对应的字符
- ie8下兼容background-sizing方案
- Java两个变量值交换问题
- 操作系统之进程基础及死锁处理策略
- [Python高效编程]
- KVM-Qemu-Libvirt三者之间的关系
- python 读取txt出现\xef\xbb\xbf…的问题