当我们Subclass Thread时,我们是否覆盖它的run方法?我们知道Thread类本身实现了Runnable,但Runnable类中没有定义run方法的主体。
这是我脑海中的画面:
Runnable - 父类 - 它有一个run方法,空体。
Thread-Child,
classA扩展了Thread-Child of Child,
当我们在“classA”中定义run()方法时,我们是否重写在Runnable类中声明的run方法? 谢谢你的时间。
答案 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。