当子类从线程父类扩展时,我们是否重写run方法

时间:2010-11-12 03:33:51

标签: java multithreading thread-safety

当我们Subclass Thread时,我们是否覆盖它的run方法?我们知道Thread类本身实现了Runnable,但Runnable类中没有定义run方法的主体。

这是我脑海中的画面:

Runnable - 父类 - 它有一个run方法,空体。

Thread-Child,

classA扩展了Thread-Child of Child,

当我们在“classA”中定义run()方法时,我们是否重写在Runnable类中声明的run方法? 谢谢你的时间。

2 个答案:

答案 0 :(得分:9)

有两种方法可以定义线程的行为:继承Thread类,或实现Runnable接口。

对于第一种方式,只需扩展Thread类并使用您自己的实现覆盖run()方法:

public class HelloThread extends Thread {
    @Override
    public void run() {
        System.out.println("Hello from a thread!");
    }
}

public class Main { 
    // main method just starts the thread 
    public static void main(String args[]) {
        (new HelloThread()).start();
    }
}

但是,为Thread实现逻辑的首选方法是创建一个实现Runnable接口的类:

public class HelloRunnable implements Runnable {
    @Override
    public void run() {
        System.out.println("Hello from a thread!");
    }
}

public class Main {
    // notice that we create a new Thread and pass it our custom Runnable
    public static void main(String args[]) {
        (new Thread(new HelloRunnable())).start();
    }
}

首选实现Runnable的原因是它提供了线程行为与线程本身之间的明确区分。例如,在使用线程池时,您实际上从未实际创建线程,只需将Runnable传递给框架,它就会在可用的线程上为您执行:

public class Main {
    public static void main(String args[]) {
        int poolSize = 5;
        ExecutorService pool = Executors.newFixedThreadPool(poolSize);
        pool.execute(new HelloRunnable());
    }
 }

进一步阅读:

答案 1 :(得分:0)

只有当您要重写线程的功能或提高其性能时,才应扩展Thread。

接口告诉您,如果您使用此接口,您将获得功能。在您的情况下,您的商务逻辑需要在线程中运行然后使用接口。

如果您有更好的方式有效地运行线程,那么扩展Thread。