2010-08-09 87 views
7

当我将下面的代码放在NetBeans中时,NetBeans在旁边给我一个警告,提示“访问静态方法睡眠”。Java - 访问静态方法睡眠 - 出现了什么问题?

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

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

+2

附注:从Java 5开始,有一个TimeUnits,您可以调用这些睡眠,在我看来,可读性更强。例如。 'TimeUnit.SECONDS.sleep(2);' – 2010-10-01 11:42:45

回答

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 someRunnable = new Runnable(){ 
    public void run(){ 
     Thread.sleep(2000); 
    } 
}; 

当“a”开始,Thread.currentThread在someRunnable的run方法是“一”线程实例。

+0

那么你怎么睡一个? – Greg 2010-08-09 13:28:34

+3

@Greg,你不'睡',你发送一条消息到'一',它需要去睡觉。一种方法是让'run'寻找一个被设置的变量,如果变量被设置,它就会进入休眠状态,并且一个外部调用者可以用来设置该变量的'a'方法。 – 2010-08-09 14:35:56

6

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

根据JavaDoc:

使当前执行的线程 休眠(暂停执行) 用于 毫秒指定的数。线程不会丢失任何监视器的所有权。

这是什么意思是,你不能睡另一线程,只有一个代码是英寸

2

那是因为睡眠()方法被声明为static因此

Thread.currentThread().sleep(2000); 

Thread.sleep(2000); 
1

netbeans给你警告,因为你正在从线程引用而不是线程类访问静态方法。 试试这个

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

睡眠方法使当前执行的线程sleep.So不需要调用Thread.currentThread()。

1

每当你尝试使用对象它不是最好的做法,NB给人当时警告访问静态方法,这里是相同的情况下

Thread.currentThread()将返回线程的对象

2

线程实例上没有对应于“sleep(long)”的方法。

Thread.currentThread()。sleep(2000);但是,因为在线程类中有一个方法被称为sleep()并且参数很长。

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

但是,什么这实际上是在编译器解决的是:

了Thread.sleep(2000);

下面的代码也相当于:

线程t =新主题(新的Runnable(){公共无效的run(){//什么也不做}}); t.sleep(2000);作为一个海报(John V)指出,这不会使实际线程(t)实例处于休眠状态 - 创建线程对象的当前线程将进入睡眠状态。

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

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