Java 多线程间的通信 等待唤醒
来源:互联网 发布:11选5软件 编辑:程序博客网 时间:2024/05/12 08:55
/*
有两个线程 一个给名字和性别赋值(input) 一个输出名字和性别(output)
但会一下输出很多同样的名字和性别(cpu没切走)
用等待唤醒机制 就可以 1 赋值一个 然后input wait 唤醒output 2 输出一个 output wait 再唤醒input
这样可以赋值一个 就输出一个
等待/唤醒机制。涉及的方法: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; 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;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{wait();}catch(InterruptedException e){}}this.name=name;this.sex=sex;flag=true;notify();}public synchronized void out(){if(!flag){try{wait();}catch(InterruptedException e){}}System.out.println("name"+name+"====="+"sex"+sex);flag=false;notify();}}class Input implements Runnable{Resource r; Input (Resource r){ this.r=r; }public void run(){int x=0;while(true){if(x==0){r.set("mike","nan");}else{r.set("莉莉","nvnvnvnvnvnv");}x=(x+1)%2;}}} class Output implements Runnable{Resource r;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 多线程间的通信 等待唤醒
- Java多线程四:线程间通信/等待唤醒机制
- java语言多线程通信--等待唤醒机制
- java多线程通信之等待唤醒机制
- 黑马程序员-JAVA基础-多线程间的通信、等待唤醒机制和新特性
- 多线程-线程间通信和等待唤醒
- Java线程间通信-等待唤醒机制
- java多线程学习之线程通信-wait()等待 notify()唤醒
- 线程间的通信------------等待唤醒机制
- 多线程之间的友好通信-等待唤醒机制
- Java基础学习5_多线程(线程间通信--等待唤醒机制)
- java多线程-线程间通信-示例代码-解决安全问题-等待唤醒机制wait()notify()notifyAll()
- java多线程——线程间通信之线程等待唤醒机制
- java多线程之 生产者和消费者 线程间通信 等待与唤醒机制
- JavaSE 多线程 线程间通信— 等待唤醒机制
- java多线程等待唤醒机制
- 多线程的等待唤醒机制
- java基础12:线程间通信----等待唤醒机制
- 创建视图
- virt-install命令参数
- HDU6180 Schedule
- 编写一个程序,将d:\java目录下的所有.java文件复制到d:\jad目录下,并将原来文件的扩展名从.java改为.jad
- win7下启动activeMQ服务
- Java 多线程间的通信 等待唤醒
- csdn图谱简介
- Android自动化测试appium for java环境搭建实操
- java UDP案例
- dubbo-admin2.8.4部署
- 17AHU排位赛3 D题 旋转吧!雪月花 ! (DFS序,线段树维护树上最值)
- ArcGIS中切片包 (.tpk)的介绍
- Maven| Maven项目出错集锦
- 数字三角形(版本I-III)[动态规划]