文章目录
1. 多线程基础
1.1 线程的概念
- 线程 (Thread): 程序执行的最小单元,一个进程中可以同时存在多个线程。多线程可以实现任务的并行执行,提高程序运行效率。
- 线程与进程: 进程是程序的执行环境,而线程是进程内部的执行单元,多个线程可以共享进程内的资源(如内存、文件句柄等)。
1.2 线程的生命周期
线程从创建到终止大致有以下状态:
- 新建(New):线程对象刚被创建,但尚未启动。
- 就绪(Runnable):调用了
start()
1方法,等待操作系统调度分配 CPU 资源。 - 运行(Running):线程获得 CPU 时间片,执行任务。
- 阻塞/等待(Blocked/Waiting):线程进入等待状态(例如等待 I/O、等待其他线程通知)。
- 终止(Terminated):线程执行完 run() 方法或因异常退出而结束执行。
2. 创建线程的方式
2.1 继承 Thread 类
- 实现方式: 定义一个类继承
Thread
,重写run()
方法,将线程运行的业务代码写在 run() 中。 - 特点:
- 代码简单直观。
- 由于 Java 只支持单继承,继承 Thread 后无法再继承其它类。
- 适用于简单场景,或当你的类本身已经是个线程时。
2.2 实现 Runnable 接口
- 实现方式: 定义一个类实现
Runnable
接口,并实现run()
方法,将业务代码放入其中。 - 特点:
- 避免了单继承的限制,一个类可以同时实现多个接口。
- 更适用于多个线程共享同一个任务,或任务需要与其他类进行逻辑组合。
- 将任务与线程分离,提高代码的可复用性和灵活性。
3. 实践:编写简单多线程程序
下面的示例程序中创建了两个线程:
- 一个通过继承 Thread 类的方式创建。
- 一个通过实现 Runnable 接口的方式创建。
- 两个线程在各自的 run() 方法中输出自己的标识信息,并循环输出简单信息。
示例代码
// MyThread.java
public class MyThread extends Thread {
@Override
public void run() {
// 模拟任务:循环输出线程信息
for (int i = 0; i < 5; i++) {
System.out.println("【继承Thread】线程名称:" + getName() + ",计数:" + i);
try {
Thread.sleep(300); // 暂停300毫秒
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
// MyRunnable.java
public class MyRunnable implements Runnable {
@Override
public void run() {
// 模拟任务:循环输出线程信息
for (int i = 0; i < 5; i++) {
System.out.println("【实现Runnable】线程名称:" + Thread.currentThread().getName() + ",计数:" + i);
try {
Thread.sleep(300); // 暂停300毫秒
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
// MultiThreadDemo.java
public class MultiThreadDemo {
public static void main(String[] args) {
// 方式1:继承 Thread 类
MyThread thread1 = new MyThread();
thread1.setName("线程-A");
// 方式2:实现 Runnable 接口,传入 Thread 构造器中
MyRunnable myRunnable = new MyRunnable();
Thread thread2 = new Thread(myRunnable, "线程-B");
// 启动两个线程
thread1.start();
thread2.start();
}
}
运行步骤(以 JetBrains IntelliJ IDEA 为例)
1.新建项目:
在 IntelliJ IDEA 中创建一个新的 Java 项目,将以上三个类分别保存为 MyThread.java
、MyRunnable.java
、和 MultiThreadDemo.java
(文件名和类名需一致)。
2.编译运行:
确保项目结构正确后,右键点击 MultiThreadDemo.java
文件,选择 Run ‘MultiThreadDemo.main()’。
IDE 的控制台窗口将显示两个线程交替输出的打印信息。
预期输出(可能输出顺序交替)
【继承Thread】线程名称:线程-A,计数:0
【实现Runnable】线程名称:线程-B,计数:0
【继承Thread】线程名称:线程-A,计数:1
【实现Runnable】线程名称:线程-B,计数:1
...
【继承Thread】线程名称:线程-A,计数:4
【实现Runnable】线程名称:线程-B,计数:4
注意:输出可能交替显示,因线程调度不可预测。
4. 总结与思考
- **线程基本概念:掌握线程的创建、运行及生命周期状态,有助于理解并发编程模型。
- 继承与实现:
- 继承 Thread 的实现方式适合简单任务,但受限于单继承;
- 实现 Runnable 接口更灵活,有利于任务重用和资源共享。
- 实践应用: 在实际开发中,根据具体需求选择合适的线程创建方式。同时注意线程安全、同步等问题,确保多线程程序运行可靠。