关于线程的知识,你知道多少?
推荐
一.场景
小白同学:小千,我看线程这一块的内容时,关于线程和进程、并行和并发的概念总是有点迷糊,你能给我解答一下吗?
没问题!这就给你安排。
二.进程的概念
1.官方概念
官方解释:进程是程序运行资源分配的最小单位。
进程是操作系统进行资源分配的最小单位,其中资源包括CPU、内存空间、磁盘 IO等。同一进程中的多条线程共享该进程中的全部系统资源,而进程和进程之间是相互独立的。进程是具有一定独立功能的、在某个数据集合上进行运行活动的程序,系统进行资源分配和调度的一个独立单位。
2.通俗解释
通俗地说,进程就是你启动了一个程序,就会启动一个进程。
不信咱们可以查看一下任务管理器,直接上图给你证明一下:
三. 线程的概念
1.官方概念
官方解释:线程是 CPU 调度的最小单位,必须依赖于进程而存在。
线程是进程的一个实体,是 CPU 调度和分派的基本单位,它是比进程更小的、能独立运行的基本单位。线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器、一组寄存器和栈),但它可以与同属一个进程的其他线程共享该进程所拥有的全部资源。
2.通俗解释
通俗地说,线程就是在一个时间点中,一个cpu运行一个线程。
四.问题1
你的电脑同时能够处理多少个线程呢?
目前主流 CPU 都是多核的。增加核心数目就是为了增加线程处理数,因为操作系统是通过线程来执行任务的,一般情况下它们是 1:1 对应关系。也就是说2核CPU,一般可以同时处理2个线程。引入超线程技术后,可以做到4个逻辑处理器同时处理4个线程。
五.问题2
根据上面第4章节讲解的内容,假如一台电脑一次只能执行4个线程,但一个QQ就有75个线程 ,并且还有浏览器等其他软件也在同时运行,这是为什么呢?
别急,慢慢听我说,其实这是涉及到了 CPU的时间片轮转机制。
假如进程切换(process switch) - 也称为上下文切换(context switch),需要5毫秒;再假设时间片设为15毫秒,则在做完15毫秒有用的工作之后,CPU将花费5毫秒来进行进程切换。
通俗地说,单个线程执行的时间很短,CPU来回切换的速度很快,看起来有多个软件在同时运行,其实只是CPU在多个软件之间进行了快速切换,欺骗了你的眼睛。所以当程序多了电脑就会卡,因为CPU在不同的线程之间来回切换需要反应时间。
六. 并行和并发的概念
1.并行
并行:同一时间可执行的线程数量。
比如,有如下四个车道,可以同时并行四辆车:
再比如:大学餐厅有四个窗口,四人可以同时打饭(不要插队哈):
或者你带女朋友买电影票的窗口,可以同时有四个人买票;或者火车站的8台取票机,可以同时支持8人取票。
所以并行线程,更多的是指同时可以执行的线程数,一般和cpu挂钩。
2.并发
并发:单位时间内执行的线程数量 。
比如:
4条公路,1分钟内驶过了10辆车;
4个打饭窗口,1分钟内卖给了20个学生饭;
4个售票窗口,1分钟内卖出了100张票;
你的电脑,1分钟内处理了50个线程。
七. 多线程死锁问题
上图说明:前面三个窗口有三对情侣排队中,最后一个是单身的小明,大家都在争抢情侣电影票,现在只剩下一套:
这个电影票最后只能被一个窗口售卖,不可能出现一票两卖的情况,所以可能存在线程安全性问题。
小明先人一步,在4号窗口买票时, 窗口小姐姐操作,把这张票锁定,其它窗口就不能卖这张票了。但小明不确定女朋友会不会来,所以一直在犹豫,其它三个窗口咬牙等待中。如果小明长时间锁定资源不放手,就会出现线程的死锁问题。
小明迟迟不给答复,其它三个窗口一直在不停的尝试购票,看看能不能购票成功,尝试次数多了,机器和其他等待人员就会受不了。
还有不知情的其他小伙伴,可能还会进行排队,大家都在不停地尝试,这就可能会造成大厅拥堵。也就是线程的资源会耗尽,造成死机。
八. Java main方法是多线程的
在Java代码中,我们常见的main方法其实就是多线程的。
执行结果如下:
九. 结语
至此,小千就把线程相关的内容带大家复习一下,现在你对线程还有疑惑吗?