Java多线程:(2)通过实现Runnable接口创建线程
在Java多线程编程中,实现Runnable接口是创建线程的推荐方式之一。本文将详细讲解这种方法的实现原理、代码示例以及其优势。
1. Runnable接口基础实现
下面是标准的Runnable接口实现方式:
//2.通过实现Runnable接口创建线程
class MyRunnnable implements Runnable{
//Runnable记录任务,在通过创建Runnable把任务告诉Thread,Thread去实现
//这是一种解耦合 把任务和线程这个概念分离开,这样的任务就可以交给其它地方那个来执行
@Override
public void run() {
while(true){
System.out.println("hello thread");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
}
public class Demo2 {
public static void main(String[] args) {
Thread t=new Thread(new MyRunnnable());
t.start();
while(true){
System.out.println("hello main");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
}
2. 关键点解析
2.1 Runnable接口的特点
- **单一抽象方法**:Runnable是函数式接口,只包含一个抽象方法`run()`
- **任务与执行分离**:Runnable只定义任务内容,线程执行由Thread类控制
- **更灵活**:可以继承其他类,不像Thread类那样占用继承位置
### 2.2 线程创建流程
1. **实现Runnable接口**:创建`MyRunnable`类并实现`run()`方法
2. **创建Thread实例**:将Runnable对象作为参数传递给Thread构造器
3. **启动线程**:调用Thread实例的`start()`方法
### 2.3 代码执行分析
- 主线程和新建线程会**并发执行**
- 两个while循环会交替打印信息
- 每个线程都有自己的执行栈
## 3. 优势分析
| 特性 | 继承Thread方式 | 实现Runnable方式 |
|---------------------|---------------|------------------|
| 占用继承位置 | 是 | 否 |
| 资源共享能力 | 弱 | 强 |
| 代码复用性 | 低 | 高 |
| 适合Lambda表达式 | 否 | 是 |
| 线程池兼容性 | 较差 | 优秀 |
## 4. 实际应用建议
1. **推荐实现Runnable接口**:
- 更符合面向对象设计原则
- 便于共享资源
- 适合线程池管理()
## 5. 常见问题解答
**Q: 为什么不能直接调用run()方法?**
A: 直接调用run()会在当前线程执行,只有start()会创建新线程并调用run()
**Q: Runnable和Callable有什么区别?**
A: Callable可以返回结果和抛出检查异常,Runnable则不能
**Q: 如何停止Runnable线程?**
A: 推荐使用标志位控制,而不是已废弃的stop()方法
## 6. 总结
实现Runnable接口创建线程是Java多线程编程的基础方式,具有以下特点:
- 符合"组合优于继承"原则
- 支持Lambda表达式简化代码
- 便于资源共享和线程池管理
- 是Java并发编程的推荐做法
掌握Runnable接口的使用,是学习Java高级并发编程的重要基础。