0

我只是从我的课本中研究一些例子,在 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);

我不明白为什么它会有所作为(如果确实如此的话)。有人可以解释一下吗?

4

9 回答 9

9

sleep()是一个静态方法并导致当前线程休眠指定的时间量。因此该currentThread()调用是多余的,并且可能会造成混淆,因为它几乎暗示您可以使用类似的代码使另一个线程休眠(您不能)。

编写该代码的最佳方法很简单:

Thread.sleep(DELAY);
于 2012-05-09T11:00:38.657 回答
3

有问题的代码与线程无关。Eclipse 只是说您应该sleep直接通过类名访问静态方法,而不是通过 instanse: Thread.sleep(DELAY)

为了清晰(和简洁),应该访问static ... f()类的任何静态方法。CC.f()

于 2012-05-09T11:01:55.563 回答
2

Thread.sleep() 已经是一个静态方法并影响当前线程。无需调用 currentThread()。

于 2012-05-09T11:01:54.753 回答
1

Thread.delay 是一个静态方法。它不需要实例来调用它——你可以说 Thread.delay()。

Thread.currentThread() 返回一个对当前线程的引用。您可以在其上调用静态方法,但您并不严格需要该引用,并且根本不使用它。你同样可以这样做:

new Thread().delay(100);

...它仍然会使当前线程休眠 - 而不是我们刚刚创建的线程。

所以 Eclipse 告诉你更好、更容易混淆的方法是 Thread.delay(100)。

于 2012-05-09T11:03:46.953 回答
1

如果我错了,请纠正我,但警告可能是“静态方法......应该以静态方式访问”(不是......应该以非静态方式访问)。

事实上,它是令人困惑的调用

someThread.sleep(1000)

因为 Thread.sleep() 是一个静态方法,它不被称为“反对” someThread,而是在当前线程上。

所以消息说“以静态方式访问静态方法”:)

于 2012-05-09T11:15:06.180 回答
0

它在执行上没有任何区别。然而,第二个选项 Thread.sleep() 更具可读性,因为用户不会因为认为它是一个实例方法而感到困惑。

于 2012-05-09T11:00:53.590 回答
0

通过访问该方法,因为Thread.currentThread().sleep()它给人的印象是它是一个实例方法,为了避免混淆,Eclipse 建议您通过所有者类访问静态方法,这样可以清楚地表明它们实际上是静态的。

于 2012-05-09T11:02:39.873 回答
0

正如 Victor Sorokin 所写,警告与带有线程的示例代码无关。这是另一个示例,在 Eclipse 中,我们会收到相同的编译器警告:

OptionBuilder.withArgName(PROPERTY_ARG).hasArg(true).isRequired(false).create(PROPERTY_ARG_OPTION);

这是使用 Apache Commons CLI 库。OptionBuilder 使用“流利的”构建器模式。我看到修复警告的唯一方法是使用推荐的 Eclipse 提示,将行分成多个语句,或者添加注释以忽略警告。

于 2014-02-14T01:32:23.240 回答
-1
Thread currentThread = Thread.currentThread();
currentThread.wait(DELAY); 
于 2017-01-11T11:32:07.180 回答