使用Thead子类创建线程VS使用Thread直接创建线程(Runnable接口)的区别
一、两种写法代码示例1. 继承 Thread 类java// 1. 继承Threadclass MyThread extends Thread {Overridepublic void run() {System.out.println(线程执行 Thread.currentThread().getName());}}// 使用MyThread t1 new MyThread();t1.start(); // 启动线程2. 实现 Runnable 接口java// 1. 实现Runnableclass MyRunnable implements Runnable {Overridepublic void run() {System.out.println(线程执行 Thread.currentThread().getName());}}// 使用MyRunnable run new MyRunnable();Thread t2 new Thread(run);t2.start();二、核心区别1. 继承限制最关键- 继承 ThreadJava 是单继承类一旦继承 Thread 不能再继承其他父类扩展性差。- 实现 Runnable只是实现接口还可以正常继承别的类灵活度高。2. 资源共享- 继承 Thread每个对象都是独立线程无法天然共享成员变量。- 实现 Runnable同一个 Runnable 对象可以传给多个 Thread天然实现多线程共享资源售票、计数场景首选。示例共享票数java// 共享资源场景Runnable 优势明显class Ticket implements Runnable {private int ticket 10; // 共享变量Overridepublic void run() {while(ticket 0) { System.out.println(Thread.currentThread().getName() 卖票 ticket--);}}}// 同一个任务对象多个线程执行共享票数Ticket task new Ticket();new Thread(task, 窗口1).start();new Thread(task, 窗口2).start();3. 职责分离- Thread既是线程对象又是任务耦合度高。- Runnable任务run和线程Thread分离符合面向对象设计。4. 代码复用- Runnable 任务可以反复交给不同线程、线程池执行复用性更强。三、执行流程共同点1. 重写/实现 run()任务逻辑不会主动开启新线程。2. 调用 start()向 JVM 申请开启新线程JVM 自动调用 run() 。误区直接调用 run() 只是普通方法调用不会创建新线程。四、使用场景推荐1. 优先使用实现 Runnable 接口- 需要共享资源- 类需要继承其他父类- 配合线程池使用线程池只接收 Runnable/Callable2. 偶尔使用继承 Thread 类- 简单独立线程、无需继承其他类、无需共享资源的简单场景。