携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第1天,点击查看活动详情
引言
为什么要有多线程?程序不用多线程不行嘛?还真不行,就拿吃鸡来说,人物在前面走,得有一个线程做地图渲染叭,得有一个线程计算扣血叭,这些操作统称为异步操作,java多线程就是用来简化复杂系统的开发的,另外如果你想使用多系统的强大处理能力,也要学习多线程。
操作系统
1940、1950年的计算机每次只能执行一个程序,程序写好之后交给操作员,操作员去一个房间等计算机空闲之后把程序放入,等待运行结果。随着时间的发展,人们意识到这样的设计使得复杂的应用程序与计算机的速度不相匹配,因此操作系统诞生了。
有了操作系统,使得原来只能运行一个程序的窘境得到改善,你可以执行多个程序了,这种方式叫批处理。之后电脑变得越便宜,进入世界各地,但是这种普及使得硬件的管理变得复杂,操作系统在此基础上做了一个抽象,把硬件的管理抽象成API,也就是设备驱动程序。
有了驱动程序使得程序与硬件的交互变得简单,但批处理的弊端还是存在,会使不管是多么强大的CPU,都无法发挥出它的威力,对此,人们提出了进程,一个程序就是一个进程,进程调度能在程序出现阻塞时,就让出CPU,交给其它进程,有了进程切换加时间片轮询的运算方式使程序飞起。
这种进程之间的切换我们叫上下文切换,但我们得保证切换不能丢失原始数据,所以需要给每个进程分配一个内存块,内存块保存了原始数据,但物理内存在同一进程的分配并不是连续的,这给程序查找数据带来不便,因此人们提出虚拟内存,一种内存映射方式,给程序提供连续的虚拟内存,然后映射到实际的物理内存即可。
线程的优势
进程的出现同样促使着线程的出现,人们希望一个应用程序下可以同时处理多个任务,这就是多任务处理,线程允许在一个进程下有多个程序控制留,和进程一样也可以享受cpu轮询的待遇。
读到这里你可能会问人们既然能用多进程搞并发,为何还要有多线程呢?这就要提到进程和线程的区别了。
我们可以把进程比喻成加油站,但真正加油的是里面的人去加油叭,进程只是操作系统资源分配的一个基本单位,操作系统调度给cpu分配时间的是线程。
进程之间的数据资源是隔离的,但同步简单,线程之间的资源是共享的,同步复杂,进程的崩溃出问题不影响其它进程,但线程崩溃了,降低程序的可靠性,进程的创建和销毁也比线程开销大,这也是为啥线程叫轻量级进程了。
线程的劣势
那线程有这么大优势,是不是越多越好呢?其实也不尽然,因为线程的切换是CPU密集型的,CPU需要保存当前程序运行状态,然后再切换下一个线程,再切换回来,容易使程序出现卡顿,因此如何减少切换次数来完成任务也是需要学习的重点。
还有就是老生常谈的线程安全问题。