java 线程学习(2)

/* //线程间通信:就是多个线程在线程在操作同一个资源,但是操作的动作不同 class Res { String name; String sex; } class Input implements Runnable { private Res r; Object obj=new Object(); Input(Res r) { this.r=r; } public void run() { int x=0; while(true) { synchronized(Input.class) //或者是Input.class(本类中唯一的对象) 而下面必须也是Input.class { //总之上下两个线程锁必须一致 可以是Input.class,Output.class,r if(x==0) { r.name="mike"; r.sex="man"; } else { r.name="丽丽"; r.sex="女女女女"; } x=(x+1)%2; } } } } class Output implements Runnable { private Res r; Output(Res r) { this.r=r; } public void run() { while(true) synchronized(Input.class) { System.out.println(r.name+"----"+r.sex); } } } class Test { public static void main(String[] args) { Res r=new Res(); Input in=new Input(r); Output out=new Output(r); Thread t1=new Thread(in); Thread t2=new Thread(out); t1.start(); t2.start(); } } */ /* //wait,notify,notifyAll都使用在同步中,因为要对持有监视器(锁)的线程操作。 //所以要使用在同步中,因为只有同步才具有锁。 //为什么这些操作线程的方法要定义在Object中? //因为这些方法在操作同步中线程时,都必须要标识它们所操作线程只有的锁, //只有同一个锁上的被等待线程,可以被同一个锁上的notify唤醒。 //不可以对不同锁中线程唤醒。 //也就是说,等待和唤醒必须是同一个锁,而锁可以是任意对象,所以可以被任意对象调用的方法定义Object中 class Res { String name; String sex; boolean flag=false; } class Input implements Runnable { private Res r; Object obj=new Object(); Input(Res r) { this.r=r; } public void run() { int x=0; while(true) { synchronized(Input.class) { if(r.flag) //等待 try{Input.class.wait();}catch(Exception e){}//使用Input.class或者Output.class或者r if(x==0) { r.name="mike"; r.sex="man"; } else { r.name="丽丽"; r.sex="女女女女"; } x=(x+1)%2; r.flag=true; Input.class.notify();// 唤醒 线程池中线程,唤醒第一个等待的 } } } } class Output implements Runnable { private Res r; Output(Res r) { this.r=r; } public void run() { while(true) synchronized(Input.class) { if(!r.flag) try{Input.class.wait();}catch(Exception e){} System.out.println(r.name+"----"+r.sex); r.flag=false; Input.class.notify(); } } } class Test { public static void main(String[] args) { Res r=new Res(); Input in=new Input(r); Output out=new Output(r); Thread t1=new Thread(in); Thread t2=new Thread(out); t1.start(); t2.start(); } } //notifyAll(); */ /* //上面代码的优化 class Res { private String name; private String sex; private boolean flag=false; public synchronized void set(String name,String sex) { if(flag) try{this.wait();}catch(Exception e){} this.name=name; this.sex=sex; flag=true; this.notify(); } public synchronized void out() { if(!flag) try{this.wait();}catch(Exception e){} System.out.println(name+"-----"+sex); flag=false; this.notify(); } } class Input implements Runnable { private Res r; Object obj=new Object(); Input(Res r) { this.r=r; } public void run() { int x=0; while(true) { if(x==0) r.set("mike","man"); else r.set("丽丽","女女女女女"); x=(x+1)%2; } } } class Output implements Runnable { private Res r; Output(Res r) { this.r=r; } public void run() { while(true) r.out(); } } class Test { public static void main(String[] args) { Res r=new Res(); new Thread(new Input(r)).start(); new Thread(new Output(r)).start(); } } */
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值