题目
Java中创建线程的两种基本方式
信息
- 类型:问答
- 难度:⭐
考点
线程创建,Runnable接口,Thread类,线程启动
快速回答
Java创建线程的两种基本方式:
- 继承Thread类:重写run()方法,直接实例化并调用start()启动
- 实现Runnable接口:实现run()方法,将实例作为参数传递给Thread对象
关键注意事项:必须调用start()而非run()方法启动线程。
解析
1. 原理说明
Java线程创建的核心是java.lang.Thread类和java.lang.Runnable接口:
- Thread类:线程的抽象表示,其
run()方法定义线程执行逻辑 - Runnable接口:函数式接口(单方法
run()),提供更灵活的线程任务定义方式
2. 代码示例
方式一:继承Thread类
// 1. 继承Thread类
class MyThread extends Thread {
@Override
public void run() {
System.out.println("线程运行中: " + Thread.currentThread().getName());
}
}
// 创建并启动线程
public class Main {
public static void main(String[] args) {
MyThread thread = new MyThread();
thread.start(); // 正确启动方式
}
}方式二:实现Runnable接口
// 2. 实现Runnable接口
class MyRunnable implements Runnable {
@Override
public void run() {
System.out.println("线程运行中: " + Thread.currentThread().getName());
}
}
public class Main {
public static void main(String[] args) {
Thread thread = new Thread(new MyRunnable());
thread.start(); // 启动线程
// Lambda简化写法(Java 8+)
new Thread(() ->
System.out.println("Lambda线程: " + Thread.currentThread().getName())
).start();
}
}3. 最佳实践
- 优先选择Runnable接口:避免单继承限制,更灵活地实现资源共享
- 使用Lambda表达式:简化代码(尤其适用于短任务)
- 线程命名:通过
Thread.setName()或构造函数命名线程,便于调试
4. 常见错误
- 错误调用run()方法:直接调用
run()会在当前线程执行,不会启动新线程 - 多次启动线程:一个线程实例只能调用一次
start(),否则抛出IllegalThreadStateException - 资源竞争问题:多个线程共享数据时需同步(初级本题暂不涉及)
5. 扩展知识
- 线程生命周期:新建(New)→ 就绪(Runnable)→ 运行(Running)→ 阻塞(Blocked)→ 终止(Terminated)
- Executor框架:推荐使用
ExecutorService替代直接创建线程(进阶内容) - Callable接口:带返回值的线程任务,需配合
Future使用