黑马程序员技术交流社区

标题: 如何获取多线程中wait()线程的name [打印本页]

作者: 刘永昌    时间: 2011-11-7 09:16
标题: 如何获取多线程中wait()线程的name
  1. /*有一个南北走向的桥,只能容纳一人过桥,现在桥的两边分别有5人,6人,编制一个多线程
  2. 让这些人到达彼岸。
  3. 程序如下;
  4. 问题,我想在wait()前添加一个System.out.println(Thread.currentThread().getName());
  5. 打印出是哪一个线程wait了,但是老没有结果,那位高人帮忙解决一下,谢谢
  6. */
  7. class Person extends Thread
  8. {
  9.         Bridge bridge;//桥对象
  10.         String id;
  11.         public Person(String id,Bridge bridge)
  12.         {
  13.                 this.bridge=bridge;
  14.                 this.id=id;
  15.         }
  16.         public void run()
  17.         {
  18.                 bridge.getBridge();//等待过桥
  19.                 System.out.println(Thread.currentThread().getName()+id+"正在过桥");
  20.                 try
  21.                 {
  22.                         Thread.sleep((int)(Math.random()*10000));//模拟过桥所需时间
  23.                 }
  24.                 catch (InterruptedException e){}
  25.                 bridge.goDownBridge();//下桥
  26.         }
  27. }
  28. class Bridge
  29. {
  30.         private boolean engaged=false;//桥的占用状态
  31.        
  32.         public synchronized void getBridge()//取得上桥资格
  33.         {
  34.                 while(engaged)
  35.                 {
  36.                         try
  37.                         {       
  38.                                 System.out.println(Thread.currentThread().getName()+"wait...");//..................................就是这一句!
  39.                                 wait();
  40.                         }
  41.                         catch (InterruptedException e){}
  42.                         engaged=true;
  43.                 }
  44.         }
  45.         public synchronized void goDownBridge()
  46.         {
  47.                 engaged=false;
  48.                 notifyAll();
  49.         }
  50. }
  51. public class  PassBridge
  52. {
  53.         public static void main(String[] args)
  54.         {
  55.                 Bridge b=new Bridge();
  56.                 Person x;
  57.                 for(int i=1;i<7;i++)
  58.                 {
  59.                         x=new Person("南边,第"+i+"人",b);
  60.                         x.start();
  61.                 }
  62.                 for(int i=1;i<6;i++)
  63.                 {
  64.                         x=new Person("北边边,第"+i+"人",b);
  65.                         x.start();
  66.                 }
  67.                 System.out.println("线程创建over!!。。。。。。。。");
  68.         }
  69. }
复制代码

作者: 李印东老师    时间: 2011-11-7 09:42
本帖最后由 李印东 于 2011-11-7 09:43 编辑

给你一个建议,重写Object中的wait()方法,在wait()中加获取的语句。。{:soso_e151:}
作者: 刘福双    时间: 2011-11-7 10:04
wait()在其他线程调用此对象的 notify() 方法或 notifyAll() 方法前,导致当前线程等待。
或者简单点:定义个数组,实例化,然后在运算(但是你想做wait()的测试 楼上的建议不错)
作者: 刘永昌    时间: 2011-11-7 10:05
李印东 发表于 2011-11-7 09:42
给你一个建议,重写Object中的wait()方法,在wait()中加获取的语句。。 ...

{:3_68:}试试

作者: 路新    时间: 2011-11-7 11:53
好好看看你的class Bridge while(engaged)根本不循环  你怎么能看到哪个在等待   
作者: 刘永昌    时间: 2011-11-7 12:07
李印东 发表于 2011-11-7 09:42
给你一个建议,重写Object中的wait()方法,在wait()中加获取的语句。。 ...

哥们儿,这object中的wait()能重写么?

public final void wait(long timeout)
                throws InterruptedException
final修饰呀!!!!
作者: 李印东老师    时间: 2011-11-7 12:24
lyc 发表于 2011-11-7 12:07
哥们儿,这object中的wait()能重写么?

public final void wait(long timeout)

等等,我去看看。。:lol
作者: 李印东老师    时间: 2011-11-7 13:02
wait();不能重写。。{:soso_e106:}我只是一个建议而已{:soso_e113:}
你把获取线程名的那条语句扔到catch里边去。。试下。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2