使用Java等待方法

时间:2018-03-29 06:54:14

标签: java multithreading synchronized synchronized-block

我有以下代码:

   public class ThreadDemo {
    public static void main(String[] args) throws InterruptedException {
        ThreadImpl thr = new ThreadImpl();
        thr.start();
        Thread.sleep(1000);
        synchronized(thr){
            System.out.println( "MAIN "+thr.hashCode());
            System.out.println("Main -->got the lock");
            thr.wait();
            System.out.println("Main -->Done with waiting");
        }
    }
}

class ThreadImpl extends Thread{
    public synchronized void sayHello(){
        System.out.println("Ssay hello ");
    }
    @Override
    public void run() {
        synchronized(this){
            System.out.println( "METHOD "+this.hashCode());
            System.out.println("METHOD Got the lock ");
            System.out.println("METHOD Going for sleep ");
                for(int i =0;i< 100000;i++);
            try {
                Thread.sleep(2000);
                System.out.println("METHOD Woke up ");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("METHOD Done leaving the thread");
        }
    }
}

在ThreadDemo的main方法中,我创建了一个线程对象ThreadImpl并启动它。接下来,主线程休眠1000毫秒。 线程的run方法将在一个单独的线程中执行。作为其中的一部分,它循环100000次并休眠2000ms。然后它退出方法。 主线程唤醒并获取&#34; thr&#34;然后继续等待状态。当另一个线程完成执行时,这个等待应该是永远的。但是,我看到以下结果:

方法1729414014
方法获得锁定 方法去睡觉
方法醒来了 方法完成离开线程
主1729414014
主要 - &gt;得到锁定 主要 - &gt;完成等待

当没有人通知主方法时,主方法是如何继续执行的呢?

1 个答案:

答案 0 :(得分:0)

这是虚假的唤醒,请参阅jls

  

由于任何一个线程,线程可能会从等待集中删除   以下行动,并将在之后的某个时间恢复:

     
      
  • 对m执行的通知操作,其中选择了t以从等待集中删除。
  •   
  • 正在对m。
  • 执行的notifyAll操作   
  • 正在执行中断操作。
  •   
  • 如果这是一个定时等待,则内部动作从m等待设置中移除t,该等待设置在至少毫秒毫秒之后发生   自等待开始以来纳秒已经过了几秒   动作。
  •   
  • 实施的内部动作。虽然不鼓励,但允许实现执行虚假唤醒&#34;,即从等待集中删除线程,从而在没有明确指示的情况下启用恢复
  •