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

Gre*_*reg 7 java netbeans sleep compiler-warnings

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

        try {
            Thread.currentThread().sleep(2000);
        }
        catch(InterruptedException ie){
            //continue
        }
Run Code Online (Sandbox Code Playgroud)

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

Joh*_*int 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.
Run Code Online (Sandbox Code Playgroud)

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

Runnable someRunnable = new Runnable(){
    public void run(){
        Thread.sleep(2000);
    }
};
Run Code Online (Sandbox Code Playgroud)

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

  • @Greg,你没有'睡一觉',你向'a'发送一条消息,它需要去睡觉.一种方法是让`run`查找正在设置的变量,如果设置了变量,它将进入睡眠状态,而外部调用者可以使用'a'中的方法来设置该变量. (3认同)

Pau*_*lin 6

sleep是静态的,所以你用它来访问它Thread.sleep(2000);.它会影响当前线程.

来自javadoc:

使当前正在执行的线程休眠(暂时停止执行)指定的毫秒数.该线程不会失去任何监视器的所有权.

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