java虚拟机中多线程总结

  

我记得最开始接触多进程,多线程这一块的时候我不是怎么理解,为什么要有多线程啊?多线程到底是个什么鬼啊?我一个程序好好的就可以运行为什么要用到多线程啊?反正我是十分费解,即使过了很长时间我还是不是很懂,听别人说过也自己试过,但总是没有理解透彻;

  

时间过了很久感觉现在对多线程有了一点新的理解,我们还是从最基本的开始,顺便看看从jvm的角度看看多线程在jvm中是怎么分配内存的,顺便和前面的几篇内容串一下,

  

<强> 1。现实中的多线程

  

举个例子:假如你一个人在家,你现在听首歌5分钟,烧开水需要10分钟,玩一局游戏要20分钟,现在问题来了,你完成这三件事总共需要多少分钟吗?

  

假如是小学生肯定会回答5 + 10 + 20=35分钟啊,但我们比小学生牛一点,稍微思考一下就知道是20分钟,因为三件事可以同时做嘛,玩游戏的同时可以听的歌,顺便烧开水,一把游戏打完,歌听完了,水也烧开然后可以去泡茶了,舒服!

  

我们用一个比较简陋的图看看这两种方式(这里先不考虑并发与并行的区别,方便理解)

  

, 癹ava虚拟机中多线程总结"

  

可以粗略的看到如果是小学生的话,要一件事一件事的做,最后花的时间是三者时间总和;而我们比较聪明,由于三件事互不影响,我们可以三件事同时开始做,这样就大大减少了不必要的等待时间,最终三者花费的时间差不多就是最长的那一个。

  

这里稍微提一下并发和并行的区别;

  

并发:这个是在计算机单CPU核的前提之下,我们要清楚一个CPU在某一时刻只能做一件事,但是现在有三件事(听的歌,烧开水,玩游戏)交给CPU做,CPU是个好人,任劳任怨,一下子去听的歌,一下子去烧开水,一下子玩游戏,最终可以把三件事都给做的完,但是假如同时有几百件事交给CPU做呢? emmmm,最后CPU就被累垮了,住院去了,于是我们计算机也卡死了,举个最贴近我们的例子:以前上学的时候作业太多,很多时候都是很多科目的作业都没有做完,那怎么办呢?只有早上去早点去抄一下同学的,但是各个课代表来收作业了,于是只能这个科目作业抄一点马上又把另外一个科目作业抄一点,玛德,最后终于在规定时间都抄完的了,可是假如你有100个科目的作业没做完,你会怎么办?用命去抄也抄不完的了,于是你就累病了....

  

并行:多核CPU的前提,现在一个电脑都有多个CPU,那么CPU同时就可以做多件事,即使事情再多,多个CPU进行切换最终花费的时间确实大大减少;还是说说上面抄作业的例子,假如你现在有10门科目的作业没做完,就靠你一个头脑一只手肯定来不及啊!于是这个时候你唤醒了前世的记忆,原来你是哪吒转世,特么的居然可以变成是三头六臂,这得可以同时抄多少份作业啊! ! !一下子作业就做完了,舒服!但是这个时候作业科目太多的话你即使有三头六臂也不够用啊,而且相互之间的协调也就变成一个很重要的问题。

  

并发和并行就是这个意思,我们现在只关注并发,看看在单CPU核的计算机中一个程序是怎么运行的?

  

<强> 2。进程和线程

  

想想什么叫做进程呢?我的理解就是程序进入了内存就是进程,比如我们电脑桌面双击QQ,优酷,java虚拟机等,操作系统就会把这些软件的内容加载到内存中去运行去了,然后就是运行某编程语言写的代码,转化为机器码调用操作系统的接口,然后操作系统的内核会那些硬件驱动程序发出一些指令,然后我们的电脑屏幕就出现变化了…我们简单画一画的图,我们主要看JVM

  

癹ava虚拟机中多线程总结"

  

我们再进入JVM中看看,其中线程1,2,3就是我们在java代码中要去实现的;

  

癹ava虚拟机中多线程总结"

  

进程:我们百度一下进程的定义,最重要的一点就是进程是操作系统资源分配的基本单位,因为每启动一个程序,一个进程就创建了,在操作系统堆内存空间上就开辟了一块空间,也就是分配了资源。

  

线程:现在再来看线程,百度一下线程定义,其实就是说:进程就是一个程序,这个程序之中可能会同时执行多个任务的代码,每一个任务就是一个线程,而且每一个线程都会在JVM中有自己独立的java栈,电脑寄存器,而且CPU只能切换线程,即使是不同程序的线程也可以相互切换。

java虚拟机中多线程总结