Java - 访问静态方法睡眠 - 出了什么问题?

时间:2010-08-09 13:12:27

标签: java netbeans sleep compiler-warnings

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

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

我做错了吗?我应该以不同的方式打电话吗?我没做任何多线程的事情。我只是有一个简单的主要方法,我想睡一会儿。

6 个答案:

答案 0 :(得分:10)

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调用来休眠,如:

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

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

答案 1 :(得分:6)

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

来自javadoc:

  

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

这意味着您无法再睡眠另一个线程,只能访问代码所在的线程。

答案 2 :(得分:2)

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

Thread.currentThread().sleep(2000);

相同
Thread.sleep(2000);

答案 3 :(得分:2)

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

Thread.currentThread()睡眠(2000);然而,编译是因为在线程类上有一个方法叫做带有long参数的sleep()。

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

但是,在编译器中实际解决的问题是:

的Thread.sleep(2000);

以下代码也是等效的:

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

正如一张海报(John V)指出的那样,这并不会使实际的线程(t)实例进入休眠状态 - 创建线程对象的当前线程将进入休眠状态。

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

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

答案 4 :(得分:1)

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

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

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

答案 5 :(得分:1)

每当你尝试使用对象访问静态方法时,这不是最佳做法,NB当时会发出警告,这里是同样的情况

Thread.currentThread()将返回一个Thread

的对象