A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© sun~~ 中级黑马   /  2013-1-7 23:50  /  1150 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张向辉 于 2013-1-16 11:54 编辑

1、如何实现线程间的通讯。
最好给代码!!

3 个回复

倒序浏览
自己理解~根据注释的思路走!
  1. /*
  2. * 绑票
  3. * 垃圾筒
  4. * 好人
  5. * 坏人
  6. */
  7. public class ThreadDemo1 {
  8.         public static void main(String[] args) {
  9.                 LaJiTong ljt = new LaJiTong();
  10.                 HaoRen haoRen = new HaoRen(ljt);
  11.                 HuaiRen huaiRen = new HuaiRen(ljt);
  12.                
  13.                 huaiRen.start();
  14.                 haoRen.start();
  15.                
  16.         }
  17. }

  18. /*
  19. * 本类是好人类,它是一个线程!
  20. * run():向共享数据(垃圾筒)中存钱!
  21. *
  22. * 因为可能好人取钱的速度没有坏人快,坏人发现没有钱就撕票了!
  23. * 如果坏人发现没钱,开始等待好人存钱,那么在好人存钱之后应该去唤醒坏人。
  24. */
  25. class HaoRen extends Thread {
  26.         private LaJiTong ljt;
  27.        
  28.         public HaoRen(LaJiTong ljt) {
  29.                 this.ljt = ljt;
  30.         }
  31.        
  32.         public void run() {
  33.                 synchronized (ljt) {
  34.                         //存钱
  35.                         System.out.println("好人:开始存钱!");
  36.                         ljt.cun(500);
  37.                         System.out.println("好人:存钱完毕!唤醒坏人!");
  38.                         ljt.notify();
  39.                         System.out.println("等待放人!");
  40.                         try {
  41.                                 Thread.sleep(5000);//sleep()是不会释放监视器对象的!
  42.                         } catch (InterruptedException e) {
  43.                         }
  44.                 }
  45.         }
  46. }

  47. /*
  48. * 因为坏人有可能先去取钱,这时好人还没有存钱。
  49. * 我们希望在坏人先取钱时,发现没有钱,应该等待好人存钱!
  50. *
  51. * 当好人存钱之后会唤醒坏人,然后坏人开始取钱!
  52. */
  53. class HuaiRen extends Thread {
  54.         private LaJiTong ljt;
  55.        
  56.         public HuaiRen(LaJiTong ljt) {
  57.                 this.ljt = ljt;
  58.         }
  59.        
  60.         public void run() {
  61.                 synchronized (ljt) {
  62.                         //查看钱
  63.                         // 如果没有钱:撕票!
  64.                         // 如果有钱:取钱,放人!
  65.                         int balance = ljt.cha();
  66.                         System.out.println("坏人:查看余额!");
  67.                         if(balance <= 0) {
  68.                                 System.out.println("坏人:发现没钱,开始等待好人存钱!");
  69.                                 try {
  70.                                         ljt.wait();
  71.                                 } catch (InterruptedException e) {
  72.                                 }
  73.                                 System.out.println("坏人:我被唤醒了,重新查看垃圾筒!");
  74.                         }
  75.                         if(ljt.cha() <= 0) {
  76.                                 System.out.println("坏人:居然没有钱,撕票!");
  77.                         } else {
  78.                                 System.out.println("坏人:哇,好多钱啊,开始取钱!");
  79.                                 ljt.qu();
  80.                                 System.out.println("坏人:钱已取到,放人!");
  81.                         }
  82.                 }
  83.         }
  84. }

  85. /*
  86. * 垃圾筒类
  87. * 它有一个属性是余额
  88. * 有存、取、查三个方法
  89. */
  90. class LaJiTong {
  91.         private int balance;
  92.        
  93.         public void cun(int balance) {
  94.                 this.balance = balance;
  95.         }
  96.        
  97.         public void qu() {
  98.                 this.balance = 0;
  99.         }
  100.        
  101.         public int cha() {
  102.                 return this.balance;
  103.         }
  104. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
郑传庆 + 1 赞一个!

查看全部评分

回复 使用道具 举报
线程之间通讯有几个关键字,举例子:join()  yield()  wait()  notify()等
另外还有判断线程是否活着啊,设置优先级等等。
他们之间通讯使用调用相应方法判断怎么执行和通讯的,具体请参照相应方法,
我这里给你举个简单例子,你可以看看,他说的是两个线程同时打印1-500,
这里加的yield()的意思是每当一个线程整除10的时候让另外的线程有机会执行。
  1. public class TestThread extends Thread{
  2.         public static void main(String[] args){
  3.                 Runner r = new Runner();
  4.                 r.start();
  5.                
  6.                 for(int i=0; i<=500; i++){
  7.                         System.out.println("main:" + i);
  8.                         if(i%10==0){yield();}
  9.                 }
  10.         }
  11. }

  12. class Runner extends Thread{
  13.         public void run(){
  14.                 for(int i=0; i<=500; i++){
  15.                         System.out.println("Runner:" + i);
  16.                         if(i%10==0){yield();}
  17.                 }
  18.         }
  19. }
复制代码
希望能帮到你。。

评分

参与人数 1技术分 +1 收起 理由
Rancho_Gump + 1 赞一个!

查看全部评分

回复 使用道具 举报
拿走研究研究
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马