在线程实例上使用sleep(long)的副作用

时间:2013-12-11 09:32:10

标签: java multithreading intellij-idea

我尝试过遵循简单的代码

public class HelloWorld {

    public static void main(String args[]) throws InterruptedException {
        System.out.println("hello World!");
        new TestThread1().sleep(10);
    }
}

class TestThread1 extends Thread{

}

但是在IDEA中,我得到了以下对话框。

enter image description here

看起来像是一个错误,但问题是为什么呢?在线程实例上调用sleep(long)有什么问题。

Thread.sleep(long)也会在当前线程上调用sleep,那么为什么我们不能直接执行它,或者为什么我们不应该这样做呢?

public static native void sleep(long millis) throws InterruptedException;

javadocs说

  

导致当前正在执行的线程进入休眠状态(暂时停止   执行)指定的毫秒数,受制于   系统定时器和调度程序的精度和准确性。线程   不会失去任何监视器的所有权。

因为它是Thread类中的静态函数,所以我们应该能够从实例中调用它,因为实例具有类信息。它是否必须与原生方法有关?

3 个答案:

答案 0 :(得分:4)

副作用是您创建了一个Thread实例(从而执行TestThread类的构造函数内的所有内容)。规则是永远不要通过类实例访问或调用静态变量或方法。

但是,编译器会优化您的错误调用:

new TestThread().sleep(10);

编译成:

new TestThread(); // <---- This is the side effect!
Thread.sleep();

这就是你的IDE建议:如果你真的想要这样,请明确写出来,以告诉我你知道你在做什么。

答案 1 :(得分:1)

sleep()是一种静态方法,所以最好将其称为Thread.sleep(),而不是new Thread().sleep()

因此它只会在sleep()实例

上的当前线程上调用new Thread()

答案 2 :(得分:0)

你正在创建一个new Thread()对象,然后调用静态方法即sleep()并抛出Thread对象而不使用Thread,因为调用可能是静态的

这至少是一件奇怪而低效的事情。

另外我相信(虽然我没有在任何地方看到明确的确认),如果你实例化一个Thread并且不调用它的start()方法,你就会在旧版本的Java中创建内存泄漏。