我只是在研究教科书中的一些示例,在Eclipse中编写代码来弄清楚它。
这是我有疑问的方法的代码:
public void run() {
//Get the lock before entering the loop
synchronized(getClass()) {
for (int i =0; i<N; i++) {
System.out.println(getName() + " is tired");
try{
Thread.currentThread().sleep(DELAY);
} catch (InterruptedException e) {}
System.out.println(getName() + " is rested");
}
在线上线:
Thread.currentThread().sleep(DELAY)
Eclipse 给出了一个警告:"应该以静态方式访问 Thread 类型的静态方法 sleep(long)。Eclipse 建议采用以下解决方案:
Thread.currentThread();
Thread.sleep(DELAY);
我不明白为什么它会有所作为(如果真的如此)。有人可以解释一下吗?
sleep()
是一个静态方法,它会导致当前线程休眠指定的时间量。因此,currentThread()
调用是多余的,并且可能会造成混淆,因为它几乎意味着您可以使用类似的代码使另一个线程休眠(您不能)。
编写该代码的最佳方法很简单:
Thread.sleep(DELAY);
有问题的代码与线程无关。Eclipse 只是说你应该直接通过类名访问静态方法sleep
,而不是通过 instanse:Thread.sleep(DELAY)
。
清楚起见(和简洁),应C.f()
访问类 C
的任何静态static ... f()
方法。
Thread.sleep() 已经是一个静态方法,会影响当前线程。没有必要调用 currentThread()。
Thread.delay 是一个静态方法。 它不需要实例来调用它 - 你可以说 Thread.delay()。
Thread.currentThread() 返回对当前线程的引用。 您可以在其上调用静态方法,但您并不严格需要引用,并且根本不使用它。 您同样可以这样做:
new Thread().delay(100);
。它仍然会使当前线程进入睡眠状态 - 而不是我们刚刚创建的线程。
所以 eclipse 告诉你,更好、更少混淆的方式是 Thread.delay(100)。
错了,请纠正我,但警告可能是"静态方法......应该以静态方式访问"(不是...应以非静态方式访问)。
事实上,打电话是令人困惑的
someThread.sleep(1000)
因为 Thread.sleep() 是一个静态方法,在 不被称为 "反对" someThread,而是在当前线程上。
因此,消息显示"以静态方式访问静态方法":)
它在执行上没有任何区别。然而,第二个选项 Thread.sleep() 更具可读性,因为用户不会混淆它是一个实例方法。
> 通过访问该方法Thread.currentThread().sleep()
它给人的印象是它是一个实例方法,为了避免混淆,Eclipse 建议您通过所有者类访问静态方法,从而表明它们实际上是静态的。
正如 Victor Sorokin所写的那样,警告与线程的示例代码无关。 这是另一个示例,在 Eclipse 中,我们得到相同的编译器警告:
OptionBuilder.withArgName(PROPERTY_ARG).hasArg(true).isRequired(false).create(PROPERTY_ARG_OPTION);
这是使用 Apache Commons CLI 库。 OptionBuilder使用"流畅"的构建器模式。 我看到修复警告的唯一方法是使用推荐的 Eclipse 提示,该提示将行分成多个语句,或者在前面附加注释以忽略警告。
Thread currentThread = Thread.currentThread();
currentThread.wait(DELAY);