核心区别
1. 资源占用
进程:拥有独立的内存空间、文件描述符、系统资源等,资源占用量大
线程:共享所属进程的资源,仅拥有少量私有资源(如栈、程序计数器),资源占用量小
2. 上下文切换开销
进程:上下文切换需要保存和恢复整个进程的状态,包括内存映射、寄存器状态等,开销大
线程:上下文切换只需保存和恢复线程的私有数据(栈、程序计数器等),开销小
这也是为什么在高并发场景下,通常推荐使用多线程而非多进程的原因之一。
3. 通信方式
进程:通信需要通过进程间通信(IPC)机制,如管道、消息队列、共享内存等,Java 中可通过socket、RMI等实现
线程:可以直接通过共享内存(共享变量)进行通信,但需要处理同步问题,Java 提供了synchronized、volatile、Lock等机制
4. 独立性
进程:独立性强,一个进程崩溃通常不会影响其他进程
线程:依赖性强,同一进程中的线程共享资源,一个线程崩溃可能导致整个进程崩溃
5. 创建与销毁开销
进程:创建和销毁需要分配和释放大量资源,开销大
线程:创建和销毁只需少量资源操作,开销小
Java 中引入线程池(ThreadPoolExecutor)就是为了减少线程创建和销毁的开销。
内在联系
包含关系:线程是进程的一部分,一个进程至少包含一个线程(主线程)
资源关系:线程共享进程的资源,进程是线程的资源容器
协作关系:进程间可以通过线程进行通信和协作
生命周期:线程的生命周期依赖于进程,当进程结束时,其所有线程也会终止
在 Java 中,main方法启动的是一个进程,该进程包含一个主线程。当我们创建新线程时,这些线程都属于该进程。
Java 中的特殊考量
JVM 与进程:每个 Java 程序通常运行在一个 JVM 进程中
线程实现:Java 线程在不同平台有不同实现,如 Windows 的Win32 threads,Linux 的pthreads
线程调度:Java 线程调度由 JVM 和操作系统共同完成
线程状态:Java 定义了 6 种线程状态:NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING、TERMINATED
何时使用进程?何时使用线程?
使用多进程:
需要隔离不同的任务,提高安全性
任务之间资源竞争少,通信需求低
需要充分利用多核 CPU,进行 CPU 密集型计算
使用多线程:
任务之间需要频繁通信和共享数据
响应时间要求高,需要减少上下文切换开销
I/O 密集型操作,如网络请求、文件读写
2万+

被折叠的 条评论
为什么被折叠?



