Java高频面试之并发编程-03
hello啊,各位观众姥爷们!!!本baby今天来报道了!哈哈哈哈哈嗝🐶
面试官:线程的创建方式有哪些?
Java 中线程的创建主要有以下三种核心方式,每种方式各有适用场景和优缺点:
一、继承 Thread 类
实现方式:
- 自定义类继承
Thread
类,重写run()
方法。 - 创建子类实例并调用
start()
方法启动线程。
代码示例:
class MyThread extends Thread {@Overridepublic void run() {System.out.println("使用 Thread 类创建线程");}
}public static void main(String[] args) {MyThread thread = new MyThread();thread.start();
}
特点:
- 优点:简单直接。
- 缺点:Java 单继承机制限制,若类已继承其他类则无法使用此方式。
二、实现 Runnable 接口
实现方式:
- 自定义类实现
Runnable
接口,重写run()
方法。 - 将实现类实例作为参数传递给
Thread
对象,调用start()
方法启动线程。
代码示例:
class MyRunnable implements Runnable {@Overridepublic void run() {System.out.println("使用 Runnable 接口创建线程");}
}public static void main(String[] args) {Thread thread = new Thread(new MyRunnable());thread.start();
}
特点:
- 优点:避免单继承限制,适合资源共享(如多线程操作同一对象)。
- 缺点:无法直接返回执行结果。
三、实现 Callable 接口
实现方式:
- 自定义类实现
Callable<T>
接口,重写call()
方法(可返回结果)。 - 将
Callable
实例包装为FutureTask
对象。 - 将
FutureTask
对象传递给Thread
对象并启动线程。
代码示例:
class MyCallable implements Callable<String> {@Overridepublic 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 使用 | 需要结果反馈的异步任务 |
线程池 | 资源复用,高效管理 | 需学习线程池配置 | 高并发或长期运行的任务 |
建议:优先选择 Runnable
或 Callable
(面向接口编程),结合线程池提升性能。