java多线程学习笔记(六) ——线程间的通信(初接触)
来源:互联网 发布:ubuntu打开pdf文件 编辑:程序博客网 时间:2024/09/21 08:15
线程间通讯:
等待/唤醒机制。
涉及的方法:
1,wait(): 让线程处于冻结状态,被wait的线程会被存储到线程池中。
2,notify():唤醒线程池中一个线程(任意).
3,notifyAll():唤醒线程池中的所有线程。
这些方法都必须定义在同步中。
因为这些方法是用于操作线程状态的方法。
必须要明确到底操作的是哪个锁上的线程。
为什么操作线程的方法wait notify notifyAll定义在了Object类中?
因为这些方法是监视器的方法。监视器其实就是锁。
锁可以是任意的对象,任意的对象调用的方式一定定义在Object类中。
最终,进行代码的优化:
多个线程在处理同一资源,但是任务却不同。
//资源class Resource{String name;String sex;}//输入class Input implements Runnable{Resource r ;//Object obj = new Object();Input(Resource r){this.r = r;}public void run(){int x = 0;while(true){synchronized(r){if(x==0){r.name = "mike";r.sex = "nan";}else{r.name = "丽丽";r.sex = "女女女女女女";}}x = (x+1)%2;}}}//输出class Output implements Runnable{Resource r;//Object obj = new Object();Output(Resource r){this.r = r;}public void run(){while(true){synchronized(r){System.out.println(r.name+"....."+r.sex);}}}}class ResourceDemo{public static void main(String[] args) {//创建资源。Resource r = new Resource();//创建任务。Input in = new Input(r);Output out = new Output(r);//创建线程,执行路径。Thread t1 = new Thread(in);Thread t2 = new Thread(out);//开启线程t1.start();t2.start();}}
等待/唤醒机制。
涉及的方法:
1,wait(): 让线程处于冻结状态,被wait的线程会被存储到线程池中。
2,notify():唤醒线程池中一个线程(任意).
3,notifyAll():唤醒线程池中的所有线程。
这些方法都必须定义在同步中。
因为这些方法是用于操作线程状态的方法。
必须要明确到底操作的是哪个锁上的线程。
为什么操作线程的方法wait notify notifyAll定义在了Object类中?
因为这些方法是监视器的方法。监视器其实就是锁。
锁可以是任意的对象,任意的对象调用的方式一定定义在Object类中。
//资源class Resource{String name;String sex;boolean flag = false;}//输入class Input implements Runnable{Resource r ;//Object obj = new Object();Input(Resource r){this.r = r;}public void run(){int x = 0;while(true){synchronized(r){if(r.flag)try{r.wait();}catch(InterruptedException e){}if(x==0){r.name = "mike";r.sex = "nan";}else{r.name = "丽丽";r.sex = "女女女女女女";}r.flag = true;r.notify();}x = (x+1)%2;}}}//输出class Output implements Runnable{Resource r;//Object obj = new Object();Output(Resource r){this.r = r;}public void run(){while(true){synchronized(r){if(!r.flag)try{r.wait();}catch(InterruptedException e){}System.out.println(r.name+"....."+r.sex);r.flag = false;r.notify();}}}}class ResourceDemo2{public static void main(String[] args) {//创建资源。Resource r = new Resource();//创建任务。Input in = new Input(r);Output out = new Output(r);//创建线程,执行路径。Thread t1 = new Thread(in);Thread t2 = new Thread(out);//开启线程t1.start();t2.start();}}
最终,进行代码的优化:
class Resource{private String name;private String sex;private boolean flag = false;public synchronized void set(String name,String sex){if(flag)try{this.wait();}catch(InterruptedException e){}this.name = name;this.sex = sex;flag = true;this.notify();}public synchronized void out(){if(!flag)try{this.wait();}catch(InterruptedException e){}System.out.println(name+"...+...."+sex);flag = false;notify();}}//输入class Input implements Runnable{Resource r ;//Object obj = new Object();Input(Resource r){this.r = r;}public void run(){int x = 0;while(true){if(x==0){r.set("mike","nan");}else{r.set("丽丽","女女女女女女");}x = (x+1)%2;}}}//输出class Output implements Runnable{Resource r;//Object obj = new Object();Output(Resource r){this.r = r;}public void run(){while(true){r.out();}}}class ResourceDemo3{public static void main(String[] args) {//创建资源。Resource r = new Resource();//创建任务。Input in = new Input(r);Output out = new Output(r);//创建线程,执行路径。Thread t1 = new Thread(in);Thread t2 = new Thread(out);//开启线程t1.start();t2.start();}}
0 0
- java多线程学习笔记(六) ——线程间的通信(初接触)
- (48)Java学习笔记——多线程 / 线程间通信 / 线程组 / 线程池 /
- Java 多线程(六)——进程间通信与线程间通信
- Java 多线程(六)——进程间通信与线程间通信
- java多线程学习笔记(三) ——多线程实例火车票问题+同步synchronized初接触
- Linux学习笔记(六)——CentOS7初接触
- 黑马程序员_多线程的线程间通信学习笔记
- 多线程学习笔记3-线程间的通信(1)
- 多线程学习笔记4-线程间的通信(2)
- 多线程06:《疯狂Java讲义》学习笔记——线程通信
- java多线程学习五:线程间的通信
- Java多线程学习笔记—线程停止
- java笔记-多线程-线程通信
- Java 学习笔记——线程间通信(day12)
- (46)Java学习笔记——多线程 / 线程的生命周期
- (47)Java学习笔记——多线程 / 线程的安全问题
- 黑马程序员 学习笔记六:线程间的通信以及通信安全问题
- Java多线程编程总结笔记——六线程的同步与锁
- Linux开机自启动服务
- hdoj 统计难题 1251 (字典树模板)
- EXCEL如何批量更改MAC地址格式?
- 插入排序
- 黑马程序员---Java学习日记---面向对象程序设计方法
- java多线程学习笔记(六) ——线程间的通信(初接触)
- 面试爱奇艺
- LeetCode 27 Move Zeroes
- Linux文件基础操作
- 浅析生产环境数据库备份与恢复
- 快速熟悉项目代码
- LINUX 压缩和解压缩
- hdu1420 Prepared for New Acmer (快速幂模)
- 黑马程序员——OC学习笔记03 面向对象2 面向对象的三大特性