1. 多线程编程基本概念
1.1 进程、线程、主线程
- 进程:在操作系统中运行的一个程序,进程是操作系统进行资源分配的基本单位,一个进程可以有多个线程。
- 线程:线程是进程中的一个执行任务,线程是CPU任务调度和执行的基本单位。
- 主线程:①是产生其他子线程的线程;②通常它必须最后完成执行,比如执行各种关闭动作。
1.2 串行、并发、并行
-
串行:CPU先执行完任务A,再去执行完任务B,再执行完任务C
-
并发:CUP在执行任务A,等待任务A完成某些操作(如IO)的过程中转而去执行任务B,而在等待任务B完成某些操作的过程中又去执行任务C,这样在多个任务之间来回切换的方式就是并发。
-
并行:并行是真正的同时执行多个任务,这依赖于多核CPU。
大人(CPU)喂小孩子吃饭(任务)比喻:
串行:我先喂饱A孩子,再去喂饱B孩子。
并发:我在喂A孩子,等待A孩子把事物嚼碎吞下的过程中去喂B孩子,然后再等待B孩子吧食物嚼碎吞下去的过程中再去喂A孩子,这样交替执行多个任务的方式就是并发。
并行:我有两个大人,每个大人负责喂一个小孩子。
1.3 线程池
线程池是一个统一管理和复用线程的容器,因为创建、销毁线程需要占用太多系统资源,所以我们可以将使用后的线程不进行销毁而是放入到线程池中进行保存,需要用到后之间从线程池中拿,减少了资源开销。
线程池是一种池化的技术,类似的还有数据库连接池、HTTP 连接池等等。池化的思想主要是为了减少每次获取和结束资源的消耗,提高对资源的利用率。
1.4 同步、异步
同步和异步通常用来形容一次方法的调用过程。
- 同步方法一旦开始调用,调用者必须等到方法调用返回后,才能继续后续行为
- 异步方法调用开始后会立刻返回,调用者可以继续后续操作;通常异步方法会在另一个线程中真实的执行,如果异步方法需要返回结果,那么当异步方法真实完成时则会通知调用者。
1.5 临界区,阻塞,非阻塞
- 临界区用来表示一种公共资源或者共享数据,可以被多个线程使用。但是每一次只有一个线程使用它,一旦临界区资源被占用其他想要使用这个资源的线程就必须等待。
- 阻塞:假如有一个线程占用了临界区资源,那么其他要用到这个资源的线程就必须在这个临界区中等待,这种情况就是阻塞。
- 非阻塞:非阻塞与阻塞恰好相反,他强调没有一个线程可以妨碍其他线程的执行,所有线程都会尝试不断向前执行。