【问题标题】:Java - Accessing Static Method Sleep - What's wrong?Java - 访问静态方法睡眠 - 怎么了?
【发布时间】:2011-03-27 07:13:50
【问题描述】:

当我将下面的代码放入 NetBeans 时,NetBeans 会在它旁边给我一个警告,说“访问静态方法睡眠”。

        try {
            Thread.currentThread().sleep(2000);
        }
        catch(InterruptedException ie){
            //continue
        }

我做错了吗?我应该用不同的方式称呼它吗?我没有做任何多线程的事情。我只是有一个简单的 main 方法,我想睡一会儿。

【问题讨论】:

  • 附带说明:从 Java 5 开始,有一个 TimeUnits,您可以在这些上调用 sleep,我认为这更具可读性。例如。 'TimeUnit.SECONDS.sleep(2);'

标签: java netbeans sleep compiler-warnings


【解决方案1】:

sleep 是静态的,因此您可以使用Thread.sleep(2000); 访问它。它会影响当前线程。

来自 javadoc:

导致当前正在执行的线程 睡觉(暂时停止执行) 对于指定数量的 毫秒。线程不丢失 任何显示器的所有权。

这意味着你不能休眠另一个线程,只能休眠代码所在的那个。

【讨论】:

    【解决方案2】:

    那是因为 sleep() 方法因此被声明为静态

    Thread.currentThread().sleep(2000);
    

    一样
    Thread.sleep(2000);
    

    【讨论】:

      【解决方案3】:

      Thread.currentThread() 返回 Thread 类的实例。调用静态方法时,您只想处理类本身。因此,在当前线程上调用静态方法,您将收到一条警告,您正在实例上调用该方法。

      你只需调用Thread.sleep(2000); 就相当于Thread.currentThread.sleep(2000);

      了解这一点很重要,因为人们曾因以下行为而被烧毁:

      Thread a = new Thread(someRunnable);
      
      a.start();
      a.sleep(2000);  //this will sleep the current thread NOT a.
      

      编辑:那我们怎么睡觉呢?您可以通过在传递给构造函数的 runnable 中编写 sleep 调用来休眠 a,例如:

      Runnable someRunnable = new Runnable(){
          public void run(){
              Thread.sleep(2000);
          }
      };
      

      当'a'启动时,someRunnable的run方法中的Thread.currentThread就是'a'线程实例。

      【讨论】:

      • @Greg,你没有“睡觉 a”,而是向“a”发送一条消息,告诉它它需要睡觉。一种方法是让run 查找正在设置的变量,如果设置了该变量,它会进入睡眠状态,并且外部调用者可以使用“a”中的方法来设置该变量。
      【解决方案4】:

      netbeans 向您发出警告,因为您正在从 Thread 引用而不是从 Thread 类访问静态方法。 试试这个

      try {
                  Thread.sleep(2000);
              }
              catch(InterruptedException ie){
                  //continue
              }
      

      sleep 方法使当前正在执行的线程进入休眠状态,因此无需调用 Thread.currentThread()。

      【讨论】:

        【解决方案5】:

        当您尝试使用对象访问静态方法时,这不是最佳做法,NB 会在那时发出警告,这是相同的情况

        Thread.currentThread() 将返回一个 Thread 对象

        【讨论】:

          【解决方案6】:

          Thread 实例上没有对应“sleep(long)”的方法。

          Thread.currentThread().sleep(2000);但是,确实可以编译,因为线程类上有一个名为 sleep() 的方法,它带有一个长参数。

          Java 允许将此作为​​编译器时间技巧,以便新编码人员在对方法的静态访问感到困惑时可以执行此操作。

          然而,这实际上在编译器中被解析为:

          Thread.sleep(2000);

          下面的代码也是等价的:

          Thread t = new Thread(new Runnable() { public void run() { // 什么都不做 } }); t.sleep(2000);

          正如一位海报 (John V) 所指出的,这不会使实际的线程 (t) 实例休眠 - 创建线程对象的当前线程被置于休眠状态。

          警告的存在是为了让您记住您正在访问类的静态方法,而不是实例变量的方法。

          要编写的适当代码始终是 Thread.sleep(2000); - 永远不要通过实例访问静态方法以避免混淆和此警告。

          【讨论】:

            猜你喜欢
            • 2016-03-06
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-01-28
            • 1970-01-01
            • 1970-01-01
            • 2010-09-29
            相关资源
            最近更新 更多