【问题标题】:Why wait method doesn't work on Thread object? [duplicate]为什么等待方法不适用于 Thread 对象? [复制]
【发布时间】:2021-01-06 16:17:52
【问题描述】:
Thread t2 = new Thread();
Thread t3 = new Thread();

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

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

【问题讨论】:

  • 如何确定t2 不等待? t2 究竟做了什么?
  • wait 与告诉t2 等待无关。请做一些research
  • 但我不明白这里到底发生了什么。带有wait方法的线程实例不会让当前正在执行的线程等待。
  • @KomalPatil t2 不做任何事情。它启动并立即终止,因为没有代码可以运行。所以t2.wait 的调用线程几乎完全不等待。它唯一等待的是t2 终止,这会通知服务员。
  • 试图告诉其他线程以这种方式等待从一开始就是一个坏主意。从长远来看,将线程设计为作为对等体进行通信的独立单元是一种更有可能最终获得良好且可维护的解决方案的方法。尝试对线程进行微观管理与对软件开发人员进行微观管理一样有效。

标签: java multithreading threadpool wait


【解决方案1】:

为什么会这样?

首先,让我们明确一点。这个函数调用t2.wait(20000)t2 线程没有任何作用。事实上,它并没有真正任何事情。它所做的只是不返回,直到两件事中的任何一件发生;

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

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

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

上面的程序运行没有t2等待20秒。

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

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

【讨论】:

    【解决方案2】:
    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

    【讨论】:

      【解决方案3】:

      使用sleep 暂停线程,不管有没有工作要完成。 wait 不会暂停线程,它只是等待线程完成(并且该线程已经完成)。

      【讨论】:

        猜你喜欢
        • 2016-05-14
        • 2015-09-26
        • 1970-01-01
        • 1970-01-01
        • 2019-09-11
        • 2014-09-10
        • 1970-01-01
        • 2021-05-05
        • 1970-01-01
        相关资源
        最近更新 更多