我们来看一下操作系统、进程、线程的包含关系:
- 操作系统是包含多个进程的容器,而每个进程是包含多个线程的容器
什么是进程?
- 代码角度:把一个类new出来是一个实例化的过程,进程就是对代码的一种实例化;
- 总结:进程是程序(理解为我们写的代码)的真正运行实例,是系统资源(内存、CPU等)分配和调度的基本单位;
什么是线程?
- 线程是CPU的基本调度单位,每个线程执行的都是进程代码的的某个片段;
- 多个线程来帮助同一进程来执行代码;
进程和线程的异同
- 起源不同,先有进程再有线程,为了提高CPU的利用率,才诞生了线程;
- 概念不同,进程是有独立功能的程序运行起来的活动,是系统分配资源(内存、CPU等)和调度的基本单位;而线程是CPU的基本调度单位;
- 内存共享方式不同,对于进程而言,不同的进程都会被操作系统分配一定的内存,但是不同进程的内存通常不共享,线程与线程之间的内存共享起来非常容易,因为本身服务于一个进程,所以线程可以直接访问共享内存,不需要处理;
- 拥有的资源不同,线程之间共享的内容包括:进程代码段、进程的共有数据、进程用户ID与进程组ID;线程独有的内容包括:线程ID、线程的堆栈;
- 数量不同,一个进程至少得拥有一个线程,否则就没有办法执行了;
- 开销不同,线程的创建、终止、线程的切换开销都小于进程;
- 生命周期相同,进程和线程从创建到结束都有就绪,等待,运行;
什么是多线程?
- 多线程是指如果一个程序允许两个或以上的线程,那么它就是多线程程序。多线程是指在单个进程中运行多个线程;
- 使用多线程最主要的目的:提高CPU利用率,可以提高处理速度,避免无效等待,卡顿等问题;
使用场景
- 多任务
- 高并发
- NIO
多线程的局限
- 性能问题:上下文切换带来的消耗
- 线程安全问题:数据安全问题(比如i++),死锁,活跃性问题(饥饿、活锁)