进程
进程是一个具有一定独立功能的程序。它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。
占用系统独立的资源单元。
线程
- 进程内部的一个执行单元
- 系统独立调度和分配的基本单位
- 每个进程,都有一个主线程,由系统自动创建
1)超线程
利用硬件指令,把1个物理cpu核心内部的2个逻辑内核,模拟成2个物理核心。
通俗点就是1个cpu变2个cpu了,这时候,同一时刻,就可以2个线程真正的同时运行。
2)多核处理器
就是cpu本身,就有2个或多个物理核心(比如:双核,四核),硬件本身就是可以同一时刻跑2个或多个线程。
同一时刻,1个cpu核心只会让1个线程使用。如果有多个线程,则并不是同时运行,需要cpu切换运行线程。
一个时刻,1个cpu核心,只会让1个线程使用
多核心cpu,超线程,同一时刻,可以真正同时运行多个线程。
线程池
当一个托管应用程序开始执行时,运行时环境(runtime)提供一个线程池(Thread Pool ),它将在代码第一次访问时被创建。
线程池的工作过程如下:
1. 线程池刚创建时,里面没有一个线程。任务队列是作为参数传进来的。不过,就算队列里面有任务,线程池也不会马上执行它们。
当添加一个任务时,线程池会做如下判断:
- 如果正在运行的线程数量小于 corePoolSize,那么马上创建线程运行这个任务;
- 如果正在运行的线程数量大于或等于 corePoolSize,那么将这个任务放入队列;
- 如果这时候队列满了,而且正在运行的线程数量小于 maximumPoolSize,那么还是要创建非核心线程立刻运行这个任务;
- 如果队列满了,而且正在运行的线程数量大于或等于 maximumPoolSize,那么线程池会抛出异常RejectExecutionException。
2. 当一个线程完成任务时,它会从队列中取下一个任务来执行。
3. 当一个线程无事可做,超过一定的时间(keepAliveTime)时,线程池会判断,如果当前运行的线程数大于 corePoolSize,那么这个线程就被停掉。所以线程池的所有任务完成后,它最终会收缩到 corePoolSize 的大小。