下面这个程序结果为什么和预期的不一样
public class test
{
  static Object lock=new Object();
  
  public static void main(String args[]) {
    for(int i=0;i<3;i++){
      work o=  new work(i);
      o.start();
    }
    synchronized (lock) {
      lock.notifyAll();
      }
  }
  
 static class work extends Thread{
    private int i;
    public work(int i){
      this.i=i;
    }
    public void run(){        synchronized(lock){
          try {
            lock.wait();
          }
          catch (InterruptedException ex) {
          }
          String str="测试";
          for(int i=0;i<3;i++){
            System.out.println(this.i + "         "+i+"  :" + str);
          }
      }
    }
  }
  
}
运行结果:
1         0  :测试
1         1  :测试
1         2  :测试
0         0  :测试
0         1  :测试
0         2  :测试
只有0号和1号线程的结果输出为什么没有2号的??

解决方案 »

  1.   

    windows xp sp2
    JDK版本是1.6.0_02
      

  2.   

    lock.wait(); wait()中加上个参数应该就可以显示2号的了。
      

  3.   

    加上参数是可也以显示2号了
    但是和程序的初衷就不一样了,lock.wait()是为了无限期等待,只有外界唤醒才可以运行
      

  4.   

    你的代码:
    public class test
    {
      static Object lock=new Object();
     
      public static void main(String args[]) {
        for(int i=0;i <3;i++){
          work o=  new work(i);
          o.start();
        }
        synchronized (lock) {
          lock.notifyAll();//唤醒线程
          }
      }
     
    static class work extends Thread{
        private int i;
        public work(int i){
          this.i=i;
        }
        public void run(){        synchronized(lock){
              try {
                lock.wait();//线程等待,但是由于wait会释放掉持有的锁。所以其他线程也可以进入方法,等待。
              }
              catch (InterruptedException ex) {
              }
              String str="测试";
              for(int i=0;i <3;i++){
                System.out.println(this.i + "        "+i+"  :" + str);
              }
          }
        }
      }
     

    你这段代码问题很多啊。
    假设
        synchronized (lock) {
          lock.notifyAll();//唤醒线程
          }
    执行过后,
    线程1被唤醒,则出现 线程1的打印信息。但由于那一次lock.notifyAll();只唤醒了线程1,
    而其他线程还在无锁的状态中等待,
    所以一直走不下去。
    因为你在 run 方法里,没有再次在lock上等待的线程。
    所以就一直等待,程序不会结束,也不会向下继续走。
    我觉得只打印出1个线程的信息的可能性也是很大的啊,
    你可以多试几次
      

  5.   

    其实还有一种可能性。
    就是任何一个线程的信息都打印不出来的。这样改一下:public class test {
    static Object lock = new Object(); public static void main(String args[]) {
    for (int i = 0; i < 3; i++) {
    work o = new work(i);
    o.start();
    }
    try {
    Thread.sleep(100);//确保线程都处于等待状态下的时候,再执行lock.notifyAll();,否则的话
                                              //有可能先调用了lock.notifyAll();,但是线程0,1,2还没有起动去执行run方法呢。
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    synchronized (lock) {
    lock.notifyAll();
    }
    } static class work extends Thread {
    private int i; public work(int i) {
    this.i = i;
    } public void run() { synchronized (lock) {
    try {
    lock.wait();
    } catch (InterruptedException ex) {
    }
    String str = "ceshi";
    for (int j = 0; j < 3; j++) {
    System.out.println(this.i + "        " + j + "  :" + str);
    }
    lock.notify();
    }
    }
    }
    }