MST

星途 面试题库

面试题:Java中实现多线程的两种常见方式及区别

在Java里,我们常用继承Thread类和实现Runnable接口这两种方式来实现多线程。请详细阐述这两种方式的具体实现步骤,并说明它们之间有哪些区别。
15.9万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

继承Thread类实现多线程

  1. 创建类继承Thread类:定义一个类,使其继承自Thread类。
class MyThread extends Thread {
    @Override
    public void run() {
        // 线程执行的代码
        System.out.println("MyThread is running.");
    }
}
  1. 重写run方法:在子类中重写run方法,将线程要执行的代码放在该方法内。
  2. 创建线程实例并启动:在main方法或其他地方创建该子类的实例,并调用start方法启动线程。
public class Main {
    public static void main(String[] args) {
        MyThread myThread = new MyThread();
        myThread.start();
    }
}

实现Runnable接口实现多线程

  1. 创建类实现Runnable接口:定义一个类,实现Runnable接口。
class MyRunnable implements Runnable {
    @Override
    public void run() {
        // 线程执行的代码
        System.out.println("MyRunnable is running.");
    }
}
  1. 重写run方法:在实现类中重写run方法,编写线程执行逻辑。
  2. 创建Thread实例并启动:创建Thread类的实例,将实现Runnable接口的类的实例作为参数传入Thread构造函数,然后调用start方法启动线程。
public class Main {
    public static void main(String[] args) {
        MyRunnable myRunnable = new MyRunnable();
        Thread thread = new Thread(myRunnable);
        thread.start();
    }
}

两种方式的区别

  1. 继承性
    • 继承Thread类:一个类继承Thread类后,就不能再继承其他类,因为Java不支持多重继承,这在一定程度上限制了类的扩展性。
    • 实现Runnable接口:一个类实现Runnable接口的同时,还可以继承其他类,保持了类继承体系的完整性,具有更好的扩展性。
  2. 资源共享
    • 继承Thread类:如果多个线程需要共享相同的资源,使用继承Thread类的方式不太方便,因为每个线程都是Thread子类的独立实例,要共享资源需要采用额外的机制,如静态变量等。
    • 实现Runnable接口:多个线程可以共享同一个实现Runnable接口的实例,方便实现资源共享,因为这些线程都是基于同一个Runnable实例创建的。
  3. 设计理念
    • 继承Thread类:更侧重于将线程作为一个独立的个体来处理,适合于线程逻辑相对独立,不需要太多共享资源的场景。
    • 实现Runnable接口:更强调将线程要执行的任务与线程本身分离,任务由实现Runnable接口的类来定义,线程只是负责执行这个任务,这种方式更符合面向对象的设计原则。