使用Thead子类创建线程VS使用Thead直接创建线程(Runnable)的区别
一、核心原理
继承 Thread 类:Thread 类本身实现了 Runnable 接口,子类通过重写run()方法定义线程执行逻辑,调用子类对象的start()方法启动线程。
实现 Runnable 接口:将线程执行逻辑封装在 Runnable 接口的run()方法中,再将该 Runnable 实例作为参数传递给 Thread 类的构造函数,通过 Thread 对象的start()方法启动线程。
二、核心区别对比
三、代码示例
继承 Thread 类
class MyThread extends Thread {
private int ticket = 5;@Override
public void run() {
while (ticket > 0) {
System.out.println(Thread.currentThread().getName() + " 卖票:" + ticket–);
}
}
}
public class ThreadDemo {
public static void main(String[] args) {
// 三个线程各卖5张票,资源不共享
new MyThread().start();
new MyThread().start();
new MyThread().start();
}
}
输出:总共卖出 15 张票,每个线程独立维护自己的 ticket 变量。
2. 实现 Runnable 接口
class MyRunnable implements Runnable {
private int ticket = 5;
@Override public void run() { while (ticket > 0) { // 注意:实际生产中需加同步锁保证线程安全 System.out.println(Thread.currentThread().getName() + " 卖票:" + ticket--); } }}
public class RunnableDemo {
public static void main(String[] args) {
MyRunnable task = new MyRunnable();
// 三个线程共享同一个task实例的ticket变量
new Thread(task, “窗口1”).start();
new Thread(task, “窗口2”).start();
new Thread(task, “窗口3”).start();
}
}
输出:总共卖出 5 张票,三个线程共同操作同一个 ticket 变量(需加同步锁避免超卖)。
四、开发建议
优先使用实现 Runnable 接口的方式:它是 Java 多线程开发的标准实践,解决了单继承问题,支持资源共享和线程池,代码可维护性和扩展性更好。
仅在需要重写 Thread 类其他方法(如start()、interrupt())时,才考虑继承 Thread 类。
如果需要线程执行后返回结果或抛出受检异常,推荐使用Callable接口结合FutureTask,它是 Runnable 的增强版。
