鼠鼠我捏,甲流晕死啦
文章目录
目录
一、线程
上几节说到了进程,进程和线程实质上是包含关系的,线程其实就是轻量化的进程。
为什么这么说?
轻量化,顾名思义就是使用起来更快,占用更小,一个进程中的多个线程之间,公用一份系统资源
(内存资源,文件描述表)
只有在进程启动,创建第一个线程的时候,需要操作系统花费成本去分配资源,一旦进程(第一个线程)创建完毕,之后再次创建线程就不需要再次分配资源了!!这样就提高了整体的效率
二、线程和多线程
线程究竟是什么呢??多线程又是怎么回事?多进程不可以吗??
举个例子:
假设一个食堂只有一个窗口,食堂有饭100份,老铁们必须给这100份吃完!
此时可以这么看 我的食堂就是我的操作系统,我的窗口就是进程,我的尬笑老铁就是线程 饭就是这个进程的任务,(每个窗口之间都有块板子,你在哪里买的饭就只能在那个窗口的地方吃)
此时只有一位尬笑老铁,老铁一看你让我一个吃一百份饭???即便是能吃完我累也累死了吧??我一个人吃完了天都黑了把??
此时就是这个进程当中只有一个线程(既不是多线程也不是多进程),效率相对较慢!!
那有的老铁可能说,那我在搞一个窗口,在搞一个老铁,再多搞几个老铁,几个窗口,反正就一百份饭,我窗口越多,老铁越多不就吃的越快吗??
这么一看,我一个老铁只需要吃五十份就吃完了,事实上确实速度提高了不少,但是你也付出了一些代价,在操作系统中,进程是比较“重量的”,你每多创建一个窗口(进程),都需要耗费额外的资源分配,每次创建都要消耗资源,如果特别多的话,那这个开销就比较大了,(这就是多进程!!)再者,我两个窗口直接我互相看不到对方,我没法确定对面吃了多少(完成多少任务),没法相互配合!!(这就是进程的隔离性) 这么一看多进程好像并没有那么理想。
那有老铁又要说了,那我就找多几个老铁不就可以了,我多找人总比多开窗口付出的代价要小很多把??
我找了十个尬笑老铁来吃饭,这么一看,我一个人老铁就吃十份就吃完了,我找人又不用特别大的付出(基本白嫖的谁不来啊),我和我找来的老铁们还可以一起吃饭!!多完美! (这就是多线程)
但是此时又出来问题了,如果我老铁越多,是不是我速度就越快了??一百份,那我找一百个老铁,一千个,那不是更快了吗??
NONONO 当然不是越多越好,大家想一想,当我真的只有一百份,却有一千个老铁,那我只有一百个老铁可以吃上,你搞的越多,我食堂都爆满了,还用不上这么多人,反而会更慢!!!
还有一个更严重的问题,可能这些老铁里就有比较暴躁的,“我吃不上,你们也别想吃!!”,直接给窗口给砸了!!!!,这导致所有老铁都吃不了了!!!哈哈哈哈哈哈
(因为公用一个系统资源,一旦有一个线程出错,就会导致整个进程崩了!!)
三、线程和进程的区别
通过上面的举例总结一下:
1.进程包含线程
2.进程有自己独立的内存空间和文件描述表,线程是公用一个内存空间和文件描述表
3.进程是操作系统进行系统资源分配的基本单位,线程是进行系统调度执行的基本单位
4.进程具有隔离性,相互不影响,同一进程的多个线程,一旦有一个出错,就会导致整个进程出错
四、JAVA如何实现多线程编程的几种方法
1.使用继承Thread重写run方法来创建线程
这里简单提一嘴,多线程多线程,每一个线程都是一个独立的执行流,如果不是多线程,这里的where(true)就会直接循环打印我走了 ,但是我们是又创建了一个线程,所以这两个是同时打印的!!!
我们可以使用JDK自带的jconsole 来查看JAVA 进程中的线程(只能看JAVA 的)
2.使用使用Runnable接口 重写run方法
3.继承Thread 使用匿名内部类
4.实现Runnable 使用匿名内部类
5.使用lambda表达式
这种是最推荐,也是最简单,最直观的,前面的都可以不会,这个一定要会!!
总结
本篇介绍了线程和进程的主要区别!!尬笑老铁举例!!,最后简单讲了下怎么用JAVA来实现多线程编程,要学的还很多 ,一起加油老铁!!!