黑马程序员技术交流社区

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

作者: heheka123    时间: 2014-4-2 18:29
标题: 如何获取多线程中wait()线程的name
本帖最后由 heheka123 于 2014-4-3 14:40 编辑
  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. }
复制代码

作者: ehuashao    时间: 2014-4-2 20:11
  1. while(engaged)
  2.                 {
  3.                         try
  4.                         {        
  5.                                 System.out.println(Thread.currentThread().getName()+"wait...");//..................................就是这一句!
  6.                                 wait();
  7.                         }
  8.                         catch (InterruptedException e){}
  9.                         engaged=true;
  10.                 }
复制代码

把engaged=true,放到while语句之外,否则engaged永远为false,它永远都执行不到。另外还建议
  1. public void run()
  2.         {
  3.                 bridge.getBridge();//等待过桥
  4.                 System.out.println(Thread.currentThread().getName()+id+"正在过桥");
  5.                 try
  6.                 {
  7.                         Thread.sleep((int)(Math.random()*10000));//模拟过桥所需时间
  8.                 }
  9.                 catch (InterruptedException e){}
  10.                 bridge.goDownBridge();//下桥
  11.         }
复制代码

这段代码最好也同步起来。不然当第一个人去执行 System.out.println(Thread.currentThread().getName()+id+"正在过桥");这句代码后,桥的状态已经被改为占用,这时候出现极端情况,它被挤出cpu,再也抢不到cpu的执行机会,那么桥的状态就会一直是占用,而其他线程也只能永远等待了。个人理解,不对的地方,欢迎讨论。




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