多线程学不会?那是因为你没看这篇文章(一)

多线程的经典场景

Java是一门面向对象的语言,面向对象,即一切事物皆对象,通过面向对象的方式,将现实世界的事物抽象成对象,现实世界中的关系抽象成类、继承,帮助人们实现对现实世界的抽象与数字建模。那么多线程,就是为了使编程更贴近生活,而使用的一种技术。

人多力量大

在现实生活中,我们就可以把每一个人看作一个线程,当多个人一起工作,就是多线程。

  1. 工作量太大,需要多人一起干,来缩短工期。
    这种场景在生活中比比皆是,比如,高考批卷老师,分工把学生的考卷批改完。如下图所示:
    在这里插入图片描述
    Java 8出现的Lambda并行流,就是采用的这种思想,不过它是JVM去实现,我们不需要做处理。

  2. 餐厅的工作流水线
    从迎宾,订餐员,厨师,传菜员,清洁工,每个人各司其职,分工合作。如下图所示:
    在这里插入图片描述
    1、顾客在收款台点单;
    2、后厨接到系统传过来的订单后开始加工;
    3、做好饭菜后传菜员取饭菜;
    4、传菜员找到客户所在位置上菜;
    5、顾客用餐后,清洁员进行打扫。

    每种角色的员工只关心自己的输入和输出。比如厨师的输入就是客户的点菜单,输出就是饭菜。而厨师的输入则是上个环节收银员的输出。这样做的好处是每个人专注于自己的工作,有助于效率的提升。

    通过分工,多人协作,餐厅的工作才能高效运转起来。我们开发的程序也是如此,如果你所有的工作都在一个线程里,那么首先这段主逻辑会相当复杂,而且难于维护和扩展,另外相信效率也会相对低下。如果我们的程序通过多线程 + 缓冲的方式,把不同步骤解耦,那么将大大提高效率。

    就拿 kafka 举例,Kafka 的 producer 发送消息的机制就是如此,首先不同的发消息线程会往缓存中累积消息,此时消息没有被真正发送出去,只是累积在本地缓存中。Kafka 有专门负责网络 IO 的 sender 线程,当缓存满了,sender 线程被唤醒,它真正把消息发送出去,而此时新的消息还会被累积进来。

    我们再想想清洁员所做的工作,是不是很熟悉?没错,其实 JVM 中的 GC 线程就相当于清洁员。

  3. 分头行动,最后汇合。
    这个对于研发同学再熟悉不过了,现在BS软件开发,前后端实现分离就是这样:

    1.前、后端研发开发接口
    2.前、后端各自开发程序
    3.前、后端联调

    第 3 步的前提是第 2 步。在第 2 步中,前后端程序员分头进行开发,谁先开发完都没有用,只有二者都开发完了,才能进入第三步。

    在微服务大行其道的时代,类似上面这种场景的多线程应用很常见。例如,你的一个业务接口中,可能会调用数个微服务接口获取数据。如果你没有采用多线程,那么每次请求时,主线程都会被阻塞。但是假如你采用了多线程开发,对微服务的几个请求可以同时发出,主线程阻塞时间只取决于几个请求中最长的那个,而不是所有请求阻塞时间之和,这样会极大地提高响应速度。

小结

其实除了文中列举的,还有许多其它使用多线程的场景。现实世界中几乎所有的工作都需要多人协作,而计算机的世界亦是如此。接下来,我们来看下Java如何实现多线程呢?

Java实现多线程的方式

其中继承 Thread 类实现 Runnable 接口是最基本的方式,但有一个共同的缺点 ---- 没有返回值。而 FutureTask 则解决了这个问题,后面会单独讲解。Executor 是 JDK 提供的多线程框架,功能十分强大。

相信大家对继承Thread类和实现Runnable接口都不陌生,也都会使用,我就把他们的底层实现的流程贴一张图:在这里插入图片描述

当我们继承了Thread类,调用了start方法,会调用start0方法,在JVM中最终调用重写的run方法。

而当我们实现了Runnable的类,将参数传入Thread的构造方法调用start方法,在调用thread类的run方法时,Runnable实现作为target对象传递进来,因而调用了target.run(),也就是你实现Runnable时写的run方法。

这样看来,Java中多线程的实现采用了模版模式。Thread是模版对象,负责线程相关的逻辑,比如线程的创建、运行以及各种操作。而线程真正的业务逻辑则被剥离出来,交由Runnable的实现类去实现。线程操作和业务逻辑完全解耦,普通开发者只需要聚焦在业务逻辑实现。

总结

至此,我们学习了多线程的应用场景,线程的创建方式,下次,我们还会学到并发问题的产生和原因详解。继续期待吧!!!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值