我尝试过遵循简单的代码
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中,我得到了以下对话框。
看起来像是一个错误,但问题是为什么呢?在线程实例上调用sleep(long)有什么问题。
Thread.sleep(long)
也会在当前线程上调用sleep,那么为什么我们不能直接执行它,或者为什么我们不应该这样做呢?
public static native void sleep(long millis) throws InterruptedException;
javadocs说
导致当前正在执行的线程进入休眠状态(暂时停止 执行)指定的毫秒数,受制于 系统定时器和调度程序的精度和准确性。线程 不会失去任何监视器的所有权。
因为它是Thread类中的静态函数,所以我们应该能够从实例中调用它,因为实例具有类信息。它是否必须与原生方法有关?
答案 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中创建内存泄漏。