为什么要创建延迟,首选Thread.sleep的静态引用而不是this.sleep?

时间:2014-01-13 19:49:11

标签: java multithreading static delay

在下面的代码中,编译器建议我使用Thread.sleep(静态引用)而不是this.sleep,为什么会这样?

public class CThreadUsingThread extends Thread{
    public void run(){
        for (int i = 0; i < 10; i++) {
            System.out.println("Thread running:"+i);

            try {
                // Why Thread.sleep(Math.round(Math.random()*1000)); is preferred?
                this.sleep(Math.round(Math.random()*1000));
            } catch (InterruptedException e) {
                System.err.println("Thread interrupted!");
            }
        }
    }
    public static void main(String [] orgs){
        CThreadUsingThread thread  = new CThreadUsingThread();
        thread.start();
    }
}

Also attached the image to make it more visible

3 个答案:

答案 0 :(得分:6)

你的代码基本上是误导性的。 看起来就像你指的是一个特定的线程,当实际上它只是调用总是指的静态Thread.sleep方法当前正在执行的线程。

在这种特殊情况下,它并非非常误导,但它仍然不是很好。考虑一下这个更糟糕的情况:

CThreadUsingThread thread  = new CThreadUsingThread();
thread.start();
thread.sleep(1000);

看起来哪个线程会发送到睡眠状态? 实际要发送到哪个线程?

顺便说一句,我也是:

  • 避免使用类的C前缀; CThreadUsingThread不是传统的Java名称
  • 首选创建Runnable并将其传递给Thread构造函数,而不是直接对Thread进行子类化。这是一个更清晰的代码分离,它明确地涉及线程和代码,它只是给线程一些代码来运行。

答案 1 :(得分:2)

Thread.sleep是一种static方法。 Java允许您使用引用变量访问静态方法,但从语法来看,它不是一个静态方法的调用。

从类名而不是从引用变量调用静态方法总是更清楚。

答案 2 :(得分:1)

因为Thread.Sleep是静态的,所以您使用Thread实例调用静态方法。没有必要这样做。

此外,扩展Thread并不是一个好主意。在自定义类中包装线程很好。