<aside> <img src="notion://custom_emoji/c233e7bc-acd0-812b-a811-00030dcd1edc/29e3e7bc-acd0-808e-ac64-007a3fac687d" alt="notion://custom_emoji/c233e7bc-acd0-812b-a811-00030dcd1edc/29e3e7bc-acd0-808e-ac64-007a3fac687d" width="40px" />
一个进程可以包含一个或多个线程。
为了更容易理解,我们可以把它们比作一个工厂:
这张表总结了它们在技术上的主要区别:
| 特性 | 进程 (Process) | 线程 (Thread) |
|---|---|---|
| 基本单位 | 操作系统资源分配的基本单位。 | CPU调度和执行的基本单位。 |
| 资源所有权 | 拥有独立的地址空间、内存、文件句柄等资源。 | 共享所属进程的资源(如堆内存、全局变量)。 |
| 私有线程栈、程序计数器、本地变量。 | ||
| 开销 | 重型 (Heavyweight)。 | |
| 创建、销毁和切换的开销都很大。 | 轻型 (Lightweight)。 | |
| 创建、销毁和切换的开销都小得多。 | ||
| 通信方式 | 复杂且慢。 | |
| 需要使用IPC(进程间通信),如管道、套接字、共享内存等。 | 简单且快。 | |
| 因为共享内存,可以直接读写共享变量(但需要处理线程安全问题)。 | ||
| 隔离性 | 强。 | |
| 一个进程崩溃不会直接影响其他进程。 | 弱。 | |
| 一个线程崩溃(如未捕获的异常)会导致整个进程(包括所有其他线程)崩溃。 | ||
| 关系 | 一个进程至少包含一个线程(主线程)。 | 线程必须在进程内部创建和运行。 |
在 Java 的上下文中,这个概念是这样对应的:
启动 JVM = 启动一个进程
当你运行一个 Java 程序(例如 java -jar myapp.jar),操作系统会启动一个 Java 虚拟机(JVM)实例。这个 JVM 实例本身就是一个进程。
Java 天生是多线程的
即使你只写了一个简单的 main 方法,这个 JVM 进程内部也已经运行了多个线程,例如:
main 方法。并发编程
你在 Java 中通过 new Thread()、Runnable、Callable 或者使用 ExecutorService(线程池)创建的,都是这个 JVM 进程内的线程。