【问题标题】:Sleeping a thread statically versus using its instance静态休眠线程与使用其实例
【发布时间】:2011-04-30 16:24:45
【问题描述】:

有什么区别-

Thread workerThread = new Thread(runnable);
workerThread.start();
workerThread.sleep(5000);
.....

Thread workerThread = new Thread(runnable);
workerThread.start();
Thread.sleep(5000);

它们都会导致工作线程暂停睡眠吗?

谢谢

【问题讨论】:

标签: java multithreading


【解决方案1】:

sleep 是影响当前线程的静态方法:http://download.oracle.com/javase/6/docs/api/java/lang/Thread.html#sleep(long)

所以没有区别,他们都不会做你想做的事。不鼓励在实例上使用静态方法deprecated,因为它会让你认为你可以做一些你实际上做不到的事情(比如这种情况)

少量添加 - 请参阅 John 对 why calling static methods from class instances is allowed in Java :-) 的回答

【讨论】:

  • +1:我不确定它是否已被弃用,因为某些方法是@Deprecated。但是,我们强烈反对它,因为它没有按照您所说的那样做它应该做的事情。
  • @Peter - 谢谢。英语不是我的母语,所以非常欢迎这些 cmets :)
  • @MByD,英语是我的母语,但总是欢迎更正、澄清和狡辩。我总是可以改进的。 ;)
  • "不鼓励在实例上使用静态方法,因为它会让你认为你可以做一些你实际上不能做的事情(比如在这种情况下)" 你是什么意思,我不能暂停工作线程 5 秒?
  • 如果你想暂停工作线程,你必须在它里面做。
【解决方案2】:

sleep 在两个实例中都是相同的静态方法,它会导致当前执行的线程进入休眠状态,而不是 workerThread。

【讨论】:

    【解决方案3】:

    唯一的实际调用是

    Thread.sleep(5000);
    

    另一个是java的一个奇怪之处,你可以通过实例变量调用静态方法。

    你应该总是使用

    Thread.sleep(5000);
    

    因为它是更好的自我记录,它是当前线程“总是”正在睡觉。如果你这样做了

    myThread.sleep(5000);
    

    您不是在休眠 myThread 线程,而是在休眠当前线程。

    【讨论】:

      【解决方案4】:

      应该首选第二个,因为 Thread.sleep 是一个静态方法,因此应该始终像所有静态方法一样在定义它的类上调用,而不是在此类的实例上调用。

      【讨论】:

        【解决方案5】:

        这是另一种可能性。使用 volatile 标志将消息传递给 C。

        volatile boolean startC = false;
        
        void B() {
          // Do initial B work.
          startC = true;  // Set the volatile flag.
          // Finish B processing not relevant to C.
        }
        
        void C() {
          // Wait for B to progress far enough.
          while (!startC) {
            Thread.sleep(100);
          }
          // B has done enough work so we can begin.
        }
        

        这不是真正的代码,只是足以让您了解我的意思。例如,您需要注意 startC 标志的可见性,或者为其编写公共 getter 和 setter,以便 B() 和 C() 都可以访问。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-11-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-03-28
          相关资源
          最近更新 更多