你不是给他Thread.sleep(5000)了么。第一次运行了,后面的没有运行!

解决方案 »

  1.   

    建议楼主在构造方法里把两个线程输出来,在run方法里把当前线程输出来,把flag也输出来。多运行几次,对照逻辑仔细分析,就会明白了。
      

  2.   

    最开始执行的构造方法。然后是下面代码的执行顺序:
    public synchronized void run() {
    while (abc) { //abc是true,执行
    Thread thread = Thread.currentThread();
    if (thread == PrintTime) { //你的情况是thread == PrintTime,执行
    while (flag == 1) { //第一次flag=0,不执行
    try {
    wait();
    } catch (InterruptedException e) {
    }
    // ;
    } System.out.println(matter1.format(nowtime)); //最先输出这句
    count++;
    flag = 1;
    try {
    System.out.println("我去休息啦"); //然后输出这句
    Thread.sleep(5000); //睡眠,就是你觉得等待时间很长的原因
    } catch (InterruptedException e) {
    System.out.println("被吵醒了");
    }
    }
    if (thread == Supervisor) { //当你等待很长时间后会逐步执行到这句
    while (flag == 0) {
    try {
    wait();
    } catch (InterruptedException e) {
    }
    ;
    }
    System.out.println("不要休息,继续");
    PrintTime.interrupt(); //这句会造成sleep异常,也就是为什么以后不会等待那么长时间的原因
    flag = 0;
    }
    notify();
    }
    }
      

  3.   

    为什么我第一次不会打断线程的睡眠,不是用了interruped函数吗
      

  4.   

    还有啊,第一个线程睡眠不是让出CPU了吗,怎么会隔很久才输出第二个线程的东西,应该立马执行第二个线程的东西啊
      

  5.   

        楼主说的第一次不被打断,是因为第一次的运行状态是,PrintTime这个线程先拿到同步锁,运行run里面的代码,而另一个线程Supervisor只能等待。
        第一个线程运行时,flag为0 ,所以不会执行wait()语句,而执行后边的休眠语句,在执行休眠语句时。因为没有执行wait()语句,所以这个线程不会释放同步锁。自然第二个线程没有机会运行,中断那条语句自然执行不到。必须等到休眠结束后边代码执行完,释放线程锁。