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
原创粉丝点击