Java高频面试之并发编程-03

hello啊,各位观众姥爷们!!!本baby今天来报道了!哈哈哈哈哈嗝

面试官:线程的创建方式有哪些?

Java 中线程的创建主要有以下三种核心方式,每种方式各有适用场景和优缺点:


一、继承 Thread 类

实现方式

  1. 自定义类继承 Thread 类,重写 run() 方法。
  2. 创建子类实例并调用 start() 方法启动线程。

代码示例

class MyThread extends Thread {
    @Override
    public void run() {
        System.out.println("使用 Thread 类创建线程");
    }
}

public static void main(String[] args) {
    MyThread thread = new MyThread();
    thread.start();
}

特点

  • 优点:简单直接。
  • 缺点:Java 单继承机制限制,若类已继承其他类则无法使用此方式。

二、实现 Runnable 接口

实现方式

  1. 自定义类实现 Runnable 接口,重写 run() 方法。
  2. 将实现类实例作为参数传递给 Thread 对象,调用 start() 方法启动线程。

代码示例

class MyRunnable implements Runnable {
    @Override
    public void run() {
        System.out.println("使用 Runnable 接口创建线程");
    }
}

public static void main(String[] args) {
    Thread thread = new Thread(new MyRunnable());
    thread.start();
}

特点

  • 优点:避免单继承限制,适合资源共享(如多线程操作同一对象)。
  • 缺点:无法直接返回执行结果。

三、实现 Callable 接口

实现方式

  1. 自定义类实现 Callable 接口,重写 call() 方法(可返回结果)。
  2. Callable 实例包装为 FutureTask 对象。
  3. FutureTask 对象传递给 Thread 对象并启动线程。

代码示例

class MyCallable implements Callable<String> {
    @Override
    public String call() throws Exception {
        return "Callable 线程返回结果";
    }
}

public static void main(String[] args) throws Exception {
    FutureTask<String> futureTask = new FutureTask<>(new MyCallable());
    Thread thread = new Thread(futureTask);
    thread.start();
    System.out.println(futureTask.get()); // 获取返回结果
}

特点

  • 优点:支持返回值,可抛出异常,灵活性高。
  • 缺点:需通过 FutureTask 获取结果,代码稍复杂。

四、高级应用:线程池(Executor 框架)

虽然严格来说线程池属于线程管理工具,但实际开发中常用其创建线程:

ExecutorService executor = Executors.newFixedThreadPool(5);
executor.submit(() -> System.out.println("线程池创建线程"));
executor.shutdown();

优势:统一管理线程生命周期,避免频繁创建/销毁线程的开销。


对比总结

方式 优点 缺点 适用场景
继承 Thread 简单直接 单继承限制 简单任务或快速验证
实现 Runnable 避免继承限制,资源共享 无返回值 多线程协同处理共享数据
实现 Callable 支持返回值,异常处理 需配合 FutureTask 使用 需要结果反馈的异步任务
线程池 资源复用,高效管理 需学习线程池配置 高并发或长期运行的任务

建议:优先选择 RunnableCallable(面向接口编程),结合线程池提升性能。

你可能感兴趣的:(java,面试,开发语言)