当我将下面的代码放在NetBeans中时,NetBeans会在旁边给出一个警告,说“访问静态方法睡眠”。
try {
Thread.currentThread().sleep(2000);
}
catch(InterruptedException ie){
//continue
}
我做错了吗?我应该以不同的方式打电话吗?我没做任何多线程的事情。我只是有一个简单的主要方法,我想睡一会儿。
答案 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
的对象