Java 并发 并发编程 多线程 编程
今天放一张自己以前用Maya建模加材质加渲染的CG图片,花了三周左右。
微信公众号
王皓的GitHub:https://github.com/TenaciousDWang
重新复习一遍多线程,记个笔记,最近比较忙,存货不多了,不一定几天更了...
首先,并发是什么,要了解什么是并发我们先看没有并发和有并发时,CPU在执行多任务时情况。
无并发有十个任务同时需要执行,一个任务执行完,再执行下一个任务。此时第一个任务需要大量时间,其他任务就需要排队等好久后才能继续执行。
有并发同样十个任务,CPU把执行时间分成若干份,每个任务执行一段时间停下并记录一下执行情况,然后切换到下一个任务执行一段时间停下记录一下执行情况,以此类推,走一圈后,回来读取第一个任务的执行情况继续按照上述套路执行。
十秒内,假设第一个任务需要执行十秒其他任务需要一秒,那么第一种情况十秒后只能执行完一个任务。第二种情况则可以执行完九个任务,因为执行第一个任务执行一秒后CPU切换到了下一个任务,后面所有任务都是一秒执行完毕,所以十秒后九个任务已经完成,CPU重新切回到第一个耗时任务继续执行。这个就叫做并发。
引用《Easy Coding》里的话描述一下并发:某个时间段内,多任务交替处理能力。
需要注意并发与并行并不是一个概念,并行又是什么?现在我们的CPU都是多核心,多个逻辑处理器,比如我现在主力机,ITX小型核弹使用一枚AMD 锐龙 2700(AMD真香)CPU,8核心,16个逻辑处理器(就是我们说的8核16线程,后面会提到线程的概念跟这个平常说的不一样,16线程实际上叫16个逻辑处理器),这时假设还是10个任务,那么根本不需要并发(我们可以把刚才并发举的例子当做单核单逻辑处理器),一个逻辑处理器处理一下个任务,十个任务同时执行,这个就叫做并行。
通俗一点讲,并发指的是KTV里只有一个麦,十个人轮流使用这个麦来唱歌,注意是轮流,而并行指的是16个麦,十个人可以同时用来唱歌。
在举个例子,医院里,两个医生同时看病叫并行,一个医生一会望,一会闻,一会问,一会切,这个叫做并发。
归根到底,都是为了提高处理任务的效率。这里的任务在计算机中我们叫做进程,比如QQ是一个进程,微信是一个进程,Excel是一个进程,网易云音乐是一个进程,你可以边听音乐边打字聊天,就要归功于并发与并行了。
通过上面的描述我们了解了并发,并行,进程三个概念。
接下来说一下还有一个主要的概念就是线程,我们现在理解了一个系统内有多个进程并发,并行,那么线程的概念也就很好理解了,进程让操作系统的并发性成为可能,而线程让进程的内部并发成为可能。
一个进程里也分又很多子任务,如果按照顺序一个一个执行则会出现上面系统无进程时的问题,这里就出现了线程的概念,一个进程包含多个线程,注意这里线程是系统调度的基本单位,不会再继续分解,且线程本身拥有的内存资源与其他线程一起,都是共享自该线程所在进程的内存资源。
是不是线程越多,系统运行的越快呢?我们来举一个通俗的例子,搬砖,现在一些砖需要从一楼搬到十楼,一个搬运工就是一个线程。如果一个搬运工一次搬一块砖到十楼再下来继续往复直到所有砖搬完,任务完成,这就是单个线程来运行效率低下。
现在我们加线程,十个搬运工来搬砖,也就是十个线程并发一次可以带十块砖上去,虽然在楼道中存在搬运工交会产生耗时,但是总体任务执行时间降低了,提高了任务执行效率。这里的交会其实可以指,线程在切换任务时,每次都要记录执行到哪里了,切到下个线程时,需要去找这个线程上次执行到哪里了,然后继续执行,这些的耗时。现在我们来1000个线程,也就是1000个搬运工来搬砖,那么楼道就会产生阻塞,效率变得更加低下,反而有可能不如单线程了,线程的切换执行也是消耗资源和时间的,所以我们需要找到合适的线程数,让工作效率最大化,同时又要充分利用CPU的资源。
本次我们了解并发,并行,进程,线程的概念,在下一次更新中,我们就开始聊一个Java中的线程创建,与生命周期。