<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" />

一个进程可以包含一个或多个线程。


🏭 一个形象的比喻:工厂和工人

为了更容易理解,我们可以把它们比作一个工厂:

  1. 进程 (Process) = 工厂
  2. 线程 (Thread) = 工厂里的工人

📊 核心区别对比表

这张表总结了它们在技术上的主要区别:

特性 进程 (Process) 线程 (Thread)
基本单位 操作系统资源分配的基本单位。 CPU调度和执行的基本单位。
资源所有权 拥有独立的地址空间、内存、文件句柄等资源。 共享所属进程的资源(如堆内存、全局变量)。
私有线程栈、程序计数器、本地变量。
开销 重型 (Heavyweight)
创建、销毁和切换的开销都很大。 轻型 (Lightweight)
创建、销毁和切换的开销都小得多。
通信方式 复杂且慢。
需要使用IPC(进程间通信),如管道、套接字、共享内存等。 简单且快。
因为共享内存,可以直接读写共享变量(但需要处理线程安全问题)。
隔离性
一个进程崩溃不会直接影响其他进程。
一个线程崩溃(如未捕获的异常)会导致整个进程(包括所有其他线程)崩溃。
关系 一个进程至少包含一个线程(主线程)。 线程必须在进程内部创建和运行。

☕ 在 Java 中的体现

在 Java 的上下文中,这个概念是这样对应的:

  1. 启动 JVM = 启动一个进程

    当你运行一个 Java 程序(例如 java -jar myapp.jar),操作系统会启动一个 Java 虚拟机(JVM)实例。这个 JVM 实例本身就是一个进程。

  2. Java 天生是多线程的

    即使你只写了一个简单的 main 方法,这个 JVM 进程内部也已经运行了多个线程,例如:

  3. 并发编程

    你在 Java 中通过 new Thread()、Runnable、Callable 或者使用 ExecutorService(线程池)创建的,都是这个 JVM 进程内的线程。

总结