您的位置:首页 > 编程语言 > Java开发

Java并发之神的修炼之路---初识多线程

2017-06-13 17:25 288 查看

前言

并发的世界美好又多变,有时让人摸不着头脑,其中的概念苦涩无味,现在LZ现在以小说的形式描述并发中的核心概念以及并发的应用场景,希望能够帮助大家理解并发,并用并发技术解决问题。由于LZ水平有限,在写作的过程中难免会有错误或表述不准确的地方,恳请读者批评指正,让我和大家一块进步,共同学习。我的QQ邮箱:1310368322@qq.com.

故事背景

秋是一个初出茅庐的Java开发者,他对一切事物都感到无比的好奇,刚进这一行就听前辈们说过:一入程序深似海,但是他还是义无反顾的跳进了这个海中,初学程序的时候有时后感到很无力,每次运行程序的时候都提心吊胆,生怕出现了什么错误,但是错误还是一个接一个,庆幸的是,一次偶然的机会,他认识了一位大师,名道格,它精通Java,在并发领域可谓泰山北斗级别的人物。在秋的诚心与努力下,道格收下了秋作为自己的弟子,传授并发之术

初识多线程

秋迫不及待地想学并发之术,大师说:莫急,先来看看什么是进程?什么是线程?,道格领着秋来到了一家餐馆,只见其中的一个服务员来到了他们的桌前,说:“先生需要什么?”,大师说:“两份黄焖鸡”;只见服务员记下了菜单,交给了后厨,然后忙别的事去了,等了一会饭好了,服务员把饭端到了他们桌前,这时,大师说:

“这家餐馆就的一天的活动就是进程,进程是正在运行的程序,程序是由代码和数据组成的,程序是‘死的’,进程是‘活的’”,就好比这家餐馆一样,如果没有厨师,员工在这里运作,它只是一个建筑而已,一旦老板开始用这些东西的时候(把程序加载到内存),它就‘活了’,变成了一个进程。直到餐馆下班,没人了(进程退出);

这里的员工、厨师都相当于线程,线程可以理解为在进程中独立运行的子任务,比如说,在餐馆营业的过程中,如果是一个人干完所有活(招呼顾客、做饭、收银等),就是单线程,多个人干活(不同类型的人干不同的活,服务员主要招呼顾客,厨师主要做饭)就是多线程,他们是独立的子任务,他们是能够运算调度的最小单位(操作系统能够进行运算调度的最小单
deff
位);

我们修炼的并发之术用的语言是Java,在Java的世界里就充满了多线程,所以以后你要好好学习多线程,这是根基。秋点了点头。

多线程的优点

大师接着问:“那你说说为什么使用多线程?多线程有什么优点?”,秋说道:“多个线程一起工作肯定快啊,就像那个服务员一样,如果顾客多了一个人肯定忙不过来啊”,大师笑了笑,说道:“你只答对了一半,要回答这个问题,得先来看看计算机是如何工作的,

线程在其中是如何运行的,电脑中有一个非常珍贵零件叫做CPU,他是处理计算一切数据的的设备,电脑中许多进程中的线程都想得到它,好让自己的任务早早地执行,但是如果线程数大于CPU个数怎么办呢?比如说一个CPU三个线程,我该把CPU让给谁执行呢?操作系统老大想出了一个比较公平的办法,规定一个时间片[一般情况下对于每个线程时间片相同],比如100ms,让线程去抢,谁抢到了就是谁的,时间片执行完了就进入下一轮的争夺,如下图:”



大师接着说:“那你觉得在单核下多线程有没有优点呢?”,秋想了想,说道:“如果只有一个CPU的话,我感觉还是一个线程执行好,多线程不好,还得去抢CPU”,大师说:“这你就错了,你忽略了线程进行IO操作,比如说一个线程在运行的过程中需要从磁盘上读取一个文件,这个时候他会把这个任务交给一个叫‘DMA’的设备去做,然后自己‘挂起’,挂起的状态就不占用CPU了,这个时候CPU是不是就闲下来了?这么珍贵的资源不用岂不浪费?你如果多启动几个线程的话,其中一个线程挂起不占CPU,别的线程还可以抢啊,CPU利用率不是就高了”,秋连连点头,大师接着说:“你说的那个是针对多个CPU而言的,多个CPU多线程可以充分地利用每一个核,如果只有一个线程那其他CPU岂不是页会浪费,好了,除了这个CPU资源利用率高还有什么优点?”

这下可难住了秋,只写过几千行代码的他怎么也想不出还有什么好处,大师看他为难的样子,说道:“这个问题回答不上来也正常,毕竟代码量少,通常,当只需要执行一种类型的任务时,在时间管理方面比执行多种类型任务要简单,比如你今天的任务有:去银行取钱、给女朋友买生日礼物,下午2点上课,这些任务如果是你一个人做的话,你需要考虑他们之间执行的顺序,有时候还需考虑他们之间的优先级,这样无疑是增加了你的负担,但是想象一下,你可以分成三个人,一个人去银行取钱,一个人给女朋友买生日礼物,一个人下午2点去上课,这样每一个都不需要考虑太多,只要完成自己的任务即可,这样的逻辑是不是更简单呢?对应到我们的程序也是如此,我们划分好职责,让不同的线程去执行,这样是不是逻辑很简单?不然的话需要考虑很多问题”

秋说:“恩恩,是啊,那我总结一下:多线程主要有两个优点:

①充分利用处理器资源

②使业务逻辑简单化”

大师说道:“总结的很好,今天就到这里,下次让你真正接触一下多线程”。秋高兴的点点头。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: