1. 线程与进程基础概念解析
在计算机科学领域,进程和线程是两个核心概念。进程可以理解为程序的一次执行实例,它是操作系统进行资源分配和调度的基本单位。每个进程都拥有独立的内存空间、数据栈和系统资源。而线程则是进程中的一个执行单元,是CPU调度的最小单位。一个进程可以包含多个线程,这些线程共享进程的内存空间和系统资源。
1.1 线程与进程的关系
线程与进程的关系可以用一个生动的比喻来理解:如果把进程比作一家公司,那么线程就是这家公司里的各个部门。公司(进程)拥有整体的办公场地和资源,而各个部门(线程)共享这些资源,同时各自独立地完成自己的工作。
在Java中,每个程序至少有一个主线程(main线程),它负责执行main方法中的代码。我们可以创建额外的线程来并行执行其他任务,这大大提高了程序的执行效率。
1.2 并发与并行的区别
并发和并行这两个概念经常被混淆,但它们有着本质的区别:
-
并发:指在同一时间段内,多个任务在单个CPU上交替执行。由于CPU切换速度极快,给用户的感觉像是多个任务同时在进行。例如,单核CPU上运行多个线程就是典型的并发场景。
-
并行:指在同一时刻,多个任务真正同时在多个CPU上执行。这需要硬件支持,如多核处理器。在多核CPU上,不同的线程可以真正同时运行在不同的核心上。
Java的多线程机制可以同时支持并发和并行执行,具体取决于运行环境的硬件配置。在多核CPU上,Java线程可以真正并行执行;而在单核CPU上,它们则是并发执行。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. Java多线程实现方式详解
Java提供了三种主要方式来实现多线程编程,每种方式都有其适用场景和特点。下面我们将详细分析这三种实现方式。
2.1 继承Thread类方式
继承Thread类是最基础的多线程实现方式。具体步骤如下:
java复制// 1. 定义一个继承Thread的子类
class MyThread extends Thread {
// 2. 重写run方法,编写线程执行逻辑
@Override
public void run() {
for (int i = 0; i < 5; i++) {
System.out.println(getName() + "执行: " + i);
}
}
}
public class ThreadDemo {
public static void main(String[] args) {
// 3. 创建线程对象
MyThread t1 = new MyThread();
MyThread t2 = new MyThread();
// 4. 启动线程(注意是start()不是run())
t1.start();
t2.start();
}
}
关键注意事项:
- 必须重写run()方法,这是线程执行的入口
- 调用start()方法而不是直接调用run()方法,start()会创建新线程并自动调用run()
- 每个线程对象只能调用一次start(),重复调用会抛出IllegalThreadStateException
适用场景:
- 简单的线程任务
- 不需要共享数据的独立线程
- 需要直接使用Thread类
