为什么 wait 方法对 Thread 对象不起作用?

Why wait method doesn't work on Thread object?

Thread t2 = new Thread();
Thread t3 = new Thread();

t1.start();
t2.start();
synchronized (t2) {
    t2.wait(20000);
}
t3.start();

上面的程序运行时 t2 没有等待 20 秒。我观察到当线程对象启动时它不会等待。为什么会这样?

使用sleep 暂停线程,无论是否有工作要完成。 wait 不会暂停线程,它只是等待线程完成(并且这个线程已经完成)。

class SleepThread extends Thread  {    
  //run method for thread
    public void run()    {    
        for(int i=1;i<5;i++)   {    
            try  {  
              //call sleep method of thread
              Thread.sleep(20000);  
            }catch(InterruptedException e){
              System.out.println(e);
            }    

          //print current thread instance with loop variable
          System.out.println(Thread.currentThread().getName() + "   : " + i);    
        }    
    }    
}

class Main{
   public static void main(String args[]){  
     //create two thread instances
        SleepThread thread_1 = new SleepThread();    
        SleepThread thread_2 = new SleepThread();    
    //start threads one by one
        thread_1.start();    
        thread_2.start();    
    }    
}  

Thread sleep method in java

Why is this happening?

首先,我们要明确。此函数调用 t2.wait(20000) 不会对 t2 线程执行任何操作。事实上,它根本 任何事情。它所做的只是不是return,直到两件事之一发生;

  • 一些其他线程调用t2.notify(),或
  • 20 秒过去了。

如果对 return 的调用用时不到 20 秒,那可能是因为 t2 线程本身在它死亡之前调用了 t2.notify()。在 Java 标准库的大多数实现中,join() 方法是通过对线程对象使用 wait()notify() 调用来实现的。

(注意:大多数作者会建议您不要在 Thread 实例上调用 wait()notify() 恰恰是因为两者之间可能存在干扰当您的代码和库代码都在同一实例上调用相同的方法时。)

The above program runs without t2 waiting for 20sec.

正如其他人已经在这里指出的那样,您没有为您的 t2 线程提供任何 run() 方法,因此不清楚为什么您会期望 t2 线程“等待”,或者,做任何其他事情。线程所做的唯一一件事就是执行您在 run() 方法中为它提供的代码。

默认的 Thread.run() 方法将调用您在构建线程时提供的 delegate 对象的 run() 方法,但您的代码不提供代表。在这种情况下,默认的 运行() 方法什么都不做。