当我们子类Thread时,我们重写它的run方法吗?我们知道Thread类本身实现了Runnable,但Runnable类中没有定义run方法的主体。当子类从线程父类扩展时我们是否覆盖run方法
这是画面在我的脑海:
Runnable接口 - 父类,它有它的运行方法,空体。
Thread-儿童,
CLASSA扩展儿童Thread-儿童,
当我们定义运行 “ClassA的”()方法时,我们它将覆盖运行的类声明的运行方法? 谢谢你的时间。
当我们子类Thread时,我们重写它的run方法吗?我们知道Thread类本身实现了Runnable,但Runnable类中没有定义run方法的主体。当子类从线程父类扩展时我们是否覆盖run方法
这是画面在我的脑海:
Runnable接口 - 父类,它有它的运行方法,空体。
Thread-儿童,
CLASSA扩展儿童Thread-儿童,
当我们定义运行 “ClassA的”()方法时,我们它将覆盖运行的类声明的运行方法? 谢谢你的时间。
有两种方法可以定义线程的行为:子类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();
}
}
然而,实施该逻辑针对线程的优选方法是通过创建一个类实现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());
}
}
延伸阅读:
只有在您要重写线程的功能或提高其性能时,才应该扩展线程。
界面告诉你,如果你使用这个界面,你会得到funcationality.In你的情况,你的楼内设有商务逻辑需要在一个线程中运行,那么使用的界面。
如果您有效地运行线程的更好方法,然后扩展线程。
很好的解释。 :) – casablanca 2010-11-12 03:55:56
这真的是很好的信息,但我没有得到我的答案,我们是否覆盖Thread类中定义的run方法。 – ranjanarr 2010-11-12 04:05:03
@ranjanarr再次阅读答案。第二句话尤其如此。 – 2010-11-12 04:06:48