2010-11-12 61 views
3

当我们子类Thread时,我们重写它的run方法吗?我们知道Thread类本身实现了Runnable,但Runnable类中没有定义run方法的主体。当子类从线程父类扩展时我们是否覆盖run方法

这是画面在我的脑海:

Runnable接口 - 父类,它有它的运行方法,空体。

Thread-儿童,

CLASSA扩展儿童Thread-儿童,

当我们定义运行 “ClassA的”()方法时,我们它将覆盖运行的类声明的运行方法? 谢谢你的时间。

回答

8

有两种方法可以定义线程的行为:子类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()); 
    } 
} 

延伸阅读:

+0

很好的解释。 :) – casablanca 2010-11-12 03:55:56

+0

这真的是很好的信息,但我没有得到我的答案,我们是否覆盖Thread类中定义的run方法。 – ranjanarr 2010-11-12 04:05:03

+0

@ranjanarr再次阅读答案。第二句话尤其如此。 – 2010-11-12 04:06:48

0

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

界面告诉你,如果你使用这个界面,你会得到funcationality.In你的情况,你的楼内设有商务逻辑需要在一个线程中运行,那么使用的界面。

如果您有效地运行线程的更好方法,然后扩展线程。