关于线程的知识,你知道多少?
一.场景
小白同学:小千,我看线程这一块的内容时,关于线程和进程、并行和并发的概念总是有点迷糊,你能给我解答一下吗?
没问题!这就给你安排。
二.进程的概念
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方法其实就是多线程的。
执行结果如下:
九. 结语
至此,小千就把线程相关的内容带大家复习一下,现在你对线程还有疑惑吗?
猜你喜欢LIKE
相关推荐HOT
更多>>java两个日期比较相差多少天
在Java中,可以使用`java.time`包下的类来比较两个日期之间相差的天数。以下是一个示例代码:importjava.time.LocalDate;importjava.time.tempo...详情>>
2023-06-27 17:19:00find命令查找文件
"find"命令是在Unix、Linux和类似系统中使用的一个非常强大的命令,用于在文件系统中查找文件和目录。它可以根据各种条件进行搜索,并提供了灵...详情>>
2023-06-16 14:00:30如何添加Java环境变量
要添加Java环境变量,请按照以下步骤进行操作:1.打开计算机的控制面板。2.点击"系统和安全"(Windows10及更高版本)或"系统"(Windows7和较早版本...详情>>
2023-06-08 09:31:10随机函数rand怎么使用
rand是一个C++的函数,用于产生一个随机数。以下是使用rand的方法:1.头文件:需要包含stdlib.h或cstdlib头文件以使用rand函数。2.使用rand()函...详情>>
2023-04-20 15:47:10什么是面向对象编程?面向对象有什么特性
面向对象编程(Object-Oriented Programming,OOP)是一种常用的编程范式,它将数据和操作数据的方法组合成一个单独的实体,称为“对象”,并且对...详情>>
2023-03-17 15:30:11Java培训问答更多>>
新Java行业疑惑解答:Java的内存管理是如何工作的?
新java script是什么?为什么要学java script
新java和大数据哪个好?未来哪个职业发展更好
新java培训班多久能学会?培训周期大概多久
新java script和java的区别有哪些?如何区分
新java script的数据类型主要有哪些?怎样学的更快
新c语言与java区别在哪里?去培训机构学哪个比较好
Java面试题库 更多>>
华为外包java面试题-Java实现单链表的逆序
Java程序员面试题
Java面试题及答案
什么是线程的上下文切换?
如何撤销已经推送(push)到远端仓库的提交(commit)信息?
你了解哪些加密算法?
- 北京校区
- 大连校区
- 广州校区
- 成都校区
- 杭州校区
- 长沙校区
- 合肥校区
- 南京校区
- 上海校区
- 深圳校区
- 武汉校区
- 郑州校区
- 西安校区
- 青岛校区
- 重庆校区
- 太原校区
- 沈阳校区
- 南昌校区
- 哈尔滨校区