ITPub博客

首页 > 应用开发 > > JAVA多线程和并发性知识点总结

JAVA多线程和并发性知识点总结

作者:u_509a2a8fdb46 时间:2019-11-11 17:04:26 0 删除 编辑

 IT人故事会 



这次说说多线程只是扩展,主要讲解一些应用,应用带一些原理讲解,同时希望各位老铁有所收获,这些内容跟前面的线程和并发容器有关系的,从应用场景引出多线程技术栈里面的应用,其实锁和同步块,容器,工具类,都是非常的使用的。反射更加适应于语法。

(一)多线程应用

① 介绍

多线程经常使用在逻辑处理里面,一个程序N个逻辑要做,一个用户请求可能需要数据库查询,第三方的系统接口,调用redis,一个用户请求需要多步组成,可以使用多线程技术来实现,去做一些调整,

② 经典场景

接触后端开发的时候,经常发现一个请求过来,后端需要做一系列的复杂的操作,下面这个后端有:系统消息,我的团队,我的钱包 对于这些信息,后面的系统如何设计。这些可能涉及到多个模块的调用。一个系统划分为多个子系统来做。

③ 后端接口执行-大概流程

互联网公司存在组织结构复杂,调用的模块比较多。设计这样系统的时候,一个信息单独的查询系统的对应接口,还是移动前端发起一次请求一下获取到。一般都做网关(API)接口,一个请求获取多个信息,网关收到信息后,获取多个子系统的接口,最后把信息汇总,返回给前端。

收到一个请求。

调用多个服务接口获取其他系统的数据信息。

最后汇总范围。

通过数据分析,越来越多的互联网电商平台的单子70%以上都来自手机端,手机端有个典型的应用,网络处理很麻烦的,移动设备的固有属性,一个人走这走这到了信号的盲区了,一个页面发起五六个接口的请求,移动互联网的应用造成了很大的损耗,一般都是一个接口获取全部的信息。

如果一个API网关需要调用3个接口,这3个接口是串行完成的,A执行完(3秒),执行B,B执行完(2秒),执行C(5秒),C执行完返回给移动端json字符串,需要10秒才能返回。

如果A,B,C这3个没有相互依赖的关系,完全可以把A交给线程1,B交给线程2,C交给线程3,来一起去完成,汇总执行的结果,需要5秒没完成返回。这样是不是效率明显得到了提升。

(二)Future

① 介绍

异步计算的结果,提供了用于检查计算是否完成,等待计算完成以及获取结果的方法。

② 接口的定义

boolean cancel(boolean mayInterruptIfRunning)

尝试取消当前任务的执行。如果任务已经取消、已经完成或者其他原因不能取消,尝试将失败。如果任务还没有启动就调用了cancel(true),任务将永远不会被执行。如果任务已经启动,参数mayInterruptIfRunning将决定任务是否应该中断执行该任务的线程,以尝试中断该任务。

如果任务不能被取消,通常是因为它已经正常完成,此时返回false,否则返回true

boolean isCancelled()

如果任务在正常结束之前被被取消返回true

3.boolean isDone()

正常结束、异常或者被取消导致任务完成,将返回true

4.V get()

等待任务结束,然后获取结果,如果任务在等待过程中被终端将抛出InterruptedException,如果任务被取消将抛出CancellationException,如果任务中执行过程中发生异常将抛出ExecutionException。

5.V get(long timeout, TimeUnit unit)

任务最多在给定时间内完成并返回结果,如果没有在给定时间内完成任务将抛出TimeoutException。

(三)CountDownLatch

① 介绍

一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。

② 常见用法

多个人等一个信号后继续执行操作。例如5个运动员,等一个发令员的枪响。

一个人等多个人的信号。旅游团等所有人签到完成才开始出发。

常见到使用的地方是zk获取连接的时候。

③ 源码分析

1.统计线程执行的情况

2.压力测试中,使用countDownLatch实现最大程度的并发处理。

2.多个线程之间,相互通信,比如线程异步调用完接口,结果通知。

(四)CyclicBarrier

① 介绍

CyclicBarrier可以使一定数量的线程反复地在栅栏位置处汇集。当线程到达栅栏位置时将调用await方法,这个方法将阻塞直到所有线程都到达栅栏位置。如果所有线程都到达栅栏位置,那么栅栏将打开,此时所有的线程都将被释放,而栅栏将被重置以便下次使用。

② 场景

坐车,老板都是票卖完了才开车。

数据库的批量操作,达到一定数量批量进行插入。

③ 源码

(五)Semaphore

①介绍

又称“信号量”,控制多个线程争抢许可。

acquire: 获取一个许可,如果没有就等待。

release: 释放一个许可。

availablePermits: 方法得到可用的许可数目。

② 场景

代码并发处理限流

举个例子,去洗浴中心的时候都会给一个手环,这个手环很多时候就是为了限制熟练,因为柜子是有限的,每个人一个柜子,如果没有手环了就是没有柜子了,手环归还后柜子就出现了,基本就是这个原理。

③ 源码

PS:工具是根据场景来的,达到某个场景这个工具才有它的价值,如果你不存在这个场景这个工具也就没有价值。多线程这块设计到3块的知识:筑基阶段(JMM,lock,cas,atomic,sync),并发容器(。里面都涉及到数据结构,我已经开通了专辑数据结构与算法,数据结构并不是一两篇文章就可以搞定的东西,大学可是一门学科。),工具类阶段(多线程工具类阶段,设计模式的体现。不同的源码都有自己的设计模式的体现)

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69927062/viewspace-3130150/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2019-08-08

  • 博文量
    210
  • 访问量
    38