当前位置 : 主页 > 网络编程 > 其它编程 >

JAVA中的多线程(五)

来源:互联网 收集:自由互联 发布时间:2023-07-02
JAVA中的多线程(五)线程间通讯其实就是多个线程在操作同一个资源就是操作的动作不同1classRes2{3Stringname;4Stringse JAVA中的多线程(五) 线程间通讯 其实就是多个线程在操作同一个资源 就是
JAVA中的多线程(五)线程间通讯其实就是多个线程在操作同一个资源就是操作的动作不同1classRes2{3Stringname;4Stringse JAVA中的多线程(五)

线程间通讯

其实就是多个线程在操作同一个资源

就是操作的动作不同

1 class Res 2 { 3 String name; 4 String sex; 5 } 6 7 class Input implements Runnable 8 { 9 private Res r;10 Object obj new Object();11 Input(Res r)12 {13 this.r r;14 }15 public void run()16 {17 int x 0;18 while(true)19 {20 synchronized(obj)21 {22 if(x0)23 {24 r.name "mike";25 r.sex "man";26 }27 else28 {29 r.name "LILY";30 r.sex "LADY";31 }32 }33 x (x1)%2;34 }35 }36 }37 38 class Output implements Runnable39 {40 private Res r;41 Object obj new Object();42 Output(Res r)43 {44 this.r r;45 }46 public void run()47 {48 while(true)49 {50 synchronized(obj)51 {52 System.out.println(r.name"..."r.sex);53 }54 }55 }56 }57 58 class InputOutputDemo59 {60 public static void main(String[] args)61 {62 Res r new Res();63 64 Input in new Input(r);65 Output out new Output(r);66 67 Thread t1 new Thread(in);68 Thread t2 new Thread(out);69 70 t1.start();71 t2.start();72 }73 } View Code

 wait()

notify()

notifyAll()

都使用在同步中因为要对持有监视器锁的线程操作

所以要使用在同步中因为只有同步才具有锁的概念

 

为什么这些操作线程的方法要定义在Object类中呢

因为这些方法在操作同步中线程时都必须要标识它们所操作线程所持有的锁

只有同一个锁上的被等待线程可以被同一个锁上的notify唤醒

不可以对不同锁中的线程进行唤醒

 

也就是说等待和唤醒必须是同一个锁

而锁可以是任意对象所以可以被任意对象调用的方法定义在Object类中

1 class Res 2 { 3 String name; 4 String sex; 5 boolean flag false; 6 } 7 8 class Input implements Runnable 9 {10 private Res r;11 Input(Res r)12 {13 this.r r;14 }15 public void run()16 {17 int x 0;18 while(true)19 {20 synchronized(r)21 {22 if(r.flag)23 try{r.wait();}catch(Exception e){}24 if(x0)25 {26 r.name "mike";27 r.sex "man";28 }29 else30 {31 r.name "LILY";32 r.sex "LADY";33 }34 x (x1)%2; /*转换性别*/35 r.flag true;36 r.notify();37 }38 }39 }40 }41 42 class Output implements Runnable43 {44 private Res r;45 Output(Res r)46 {47 this.r r;48 }49 public void run()50 {51 while(true)52 {53 synchronized(r)54 {55 if(!r.flag)56 try{r.wait();}catch(Exception e){}57 System.out.println(r.name"..."r.sex);58 r.flag false;59 r.notify();60 }61 }62 }63 }64 65 class InputOutputDemo66 {67 public static void main(String[] args)68 {69 Res r new Res();70 71 Input in new Input(r);72 Output out new Output(r);73 74 Thread t1 new Thread(in);75 Thread t2 new Thread(out);76 77 t1.start();78 t2.start();79 }80 } View Code

 优化

1 class Res 2 { 3 private String name; 4 private String sex; 5 private boolean flag false; 6 7 public synchronized void set(String name,String sex) 8 { 9 if(flag)10 try{this.wait();}catch(Exception e){}11 this.name name;12 this.sex sex;13 14 flag true;15 this.notify();16 }17 public synchronized void out()18 {19 if(!flag)20 try{this.wait();}catch(Exception e){}21 System.out.println(name"..."sex);22 flag false;23 this.notify();24 }25 }26 27 class Input implements Runnable28 {29 private Res r;30 Input(Res r)31 {32 this.r r;33 }34 public void run()35 {36 int x 0;37 while(true)38 {39 if(x0)40 {41 r.set("mike","man"); 42 }43 else44 {45 r.set("LILY","LADY");46 }47 x (x1)%2; /*转换性别*/48 }49 }50 }51 52 class Output implements Runnable53 {54 private Res r;55 Output(Res r)56 {57 this.r r;58 }59 public void run()60 {61 while(true)62 {63 r.out();64 }65 }66 }67 68 class InputOutputDemo69 {70 public static void main(String[] args)71 {72 Res r new Res();73 74 Input in new Input(r);75 Output out new Output(r);76 77 Thread t1 new Thread(in);78 Thread t2 new Thread(out);79 80 t1.start();81 t2.start();82 }83 } View Code

 

posted on 2017-06-20 21:18 零EVA 阅读(...) 评论(...) 编辑 收藏

转:https://www.cnblogs.com/hepengke/p/7056370.html

上一篇:Android改变一行文字其中几个字的颜色
下一篇:没有了
网友评论