多线程需要学习的相关知识:
- JavaSE : 多线程基础
- JUC : 多线程高级
一些概念
1.程序
完成某个任务、功能 用某种语言编写的一组指令的集合。
2.软件
- 软件 = 程序 + 程序运行所需文件;
- 一个软件中可能有很多个程序
3.进程
- 程序的一次运行。
- 一个进程就是一个正在运行中的程序,一款软件对应一个进程;
- 每个软件(每个进程)之间是独立的,独立体现在资源上;
操作系统在分配资源(内存)的时候,是以进程为单位的。因此进程之间进行通信(交换数据)时,成本比较高,相当于两个软件之间进行通信,因此引入线程。
4.线程
- 线程是进程中的某一条执行路径
- 同一个进程中的多个线程之间是可以共享部分内存的(方法区、堆),每个线程的部分内存又是独立的。
- 同一个进程的线程之间数据交换成本较低,线程的切换对于CPU和操作系统来说,成本比进程低的多。因此通常用多线程来代替多进程方式,实现多任务开发。
- 线程是CPU调度的最小单位;进程是系统分配内存资源的最小单位;
5.并行和并发
一个CPU核同一时刻执行一个程序,因此在单核 cpu 下,线程实际还是串行执行的。
CPU核数 = 并行度
并发(Concurrent)
操作系统中有一个组件叫做任务调度器,将 cpu 的时间片(windows 下时间片最小约为 15 毫秒)分给不同的程序使用,只是由于 cpu 在线程间(时间片很短)的切换非常快,人类感 觉是同时运行的 。一般会将这种线程轮流使用 CPU 的做法称为并发(concurrent)
并行
多核 cpu下,每个核(core) 都可以调度运行线程,这时候线程可以是并行的,不同的线程同时使用不同的cpu在执行。两个进程互不抢占CPU资源,可以同时进行,这种方式我们称之为并行(Parallel)。
如图所示,是并行和并发共存;
多线程听上去是非常专业的概念,但其实非常简单:单线程的程序只有一条执行路径,多线程的程序则包含多条执行路径,多条执行路径之间互不干扰,例如:
(1)单线程:
一旦前面的车,阻塞了,后面的车只能一直等待
(2)多线程:
其中一条车道阻塞了,不影响其他车道
线程的应用
1.异步调用
同步调用案例
说白了就是单线程,必须等前面干完了才能干下一步
异步调用案例
异步调用说白了就是将一部分任务交给一个线程去做