使用implements Runnable和extends Thread的方式创建线程有什么不同吗?

在Java里面,创建线程有两种方式,一种是通过实现Runnable,然后把它传给Thread的构造方法。

public class MyRunnable implements Runnable {
    public void run() { }
}
new Thread(new MyRunnable()).start();

第二种是直接继承Thread。

public class MyThread extends Thread {
    public void run() { }
}
new MyThread().start();

这两种方式都能创建线程,它们之间有什么区别吗?

javathreadrunnablemultithreading多线程
1
219
已修改
小课
小课2022-05-15 16:51
1 个回答

建议使用第一种实现Runnable的方式,因为这种方式复用性和扩展性更好,比如说我们继承一些现有的基础任务类,然后再实现Runnable启动线程,提供代码复用率。

public class MyRunnable extends BaseTask implements Runnable {
    public void run() { }
}

如果我们是采用继承Thread的方式,我们将无法再继承其它类。继承Thread这种方式通常是用于统一修改线程的某些参数或者处理一些事务。

public class MyThread extends Thread {
    public MyThread(Runnable target) {
        super(target);
        setUncaughtExceptionHandler((t, e) -> {
            //do something
        });
    }
}
new MyThread(new MyRunnable()).start();

上面就是通过继承Thread,统一处理线程中的异常,然后再结合第一种方式来创建线程。

1
小课
小课2022-05-15 17:34
你的回答

内容