文档章节

多线程的概念介绍及出现的问题

BK灬
 BK灬
发布于 2016/06/17 15:49
字数 883
阅读 36
收藏 0
1.在Java中,多线程有三种实现的方式(别的语言也可以实现多线程,比如scala,nodeJs)

1.1.继承Thread类

1.2.实现Runnable接口

1.3.实现Callable接口

2.为什么我们会使用多线程?

answer:我们平时写的代码都是单线程,如果数据量过大,取数据的时候就会加载过慢,导致前端页面展示出现问题.如果我们采用多线程,那么同样的数据,就会被多个线程去处理加载,充分利用了CPU,这就是多线的最大亮点.

3.继承Thread类,实现Runnale接口与实现Callable接口的区别:

answer:继承Thread类,实现Runnale接口无返回值,实现Callable接口有返回值(需泛型)

4.能不能利用继承Thread类,实现Runnale接口,拿到返回值呢?

answer:可以,在线程中声明一个静态变量,然后将处理过后的数据全部加入到静态变量中,但是取数据的时候,就需要自己做数据处理了.因为第一次请求完后,静态变量中就会有所有数据了,如果第二次再请求,并不会将第一次请求的数据清空,所以数据会冗余.

5.为了解决4中,蒙蔽外人的办法,所以出现了实现Callable接口的多线程

实现Callable接口的步骤:

5.1.创建线程池:ExecutorService pool = Executors.newCachedThreadPool();

5.2.提交启动的线程并得到future对象:Future<List<Map<String, Object>>> future = pool.submit(new ReadLogFileCallableByYear(dateList));

5.3.关闭线程池:pool.shutdown();

5.4.future取值:List<Map<String, Object>> list = future.get(1, TimeUnit.SECONDS); //延迟一分钟获取数据

6.Future接口介绍:Future表示异步计算结果

6.1.三种功能:

6.1.1.判断任务是否完成

6.1.2.能够中断任务

6.1.3.能够获取任务执行的结果

7.多线程安全性问题:

7.1.普通变量情况

7.1.1.线程A和B同时修改i变量

7.1.2.A先获取到了i,在线程栈里,i+1变成了2,这个时候只在线程栈里变成了2,实际变量没有变成2

7.1.3.这个时候,B也取变量i,此时取到的i是1,然后在线程栈里也+1,这样B线程栈里2

7.1.4.A线程把线程栈里面的i,放到主内存是2,B又放了一次也是2,所以结果是2

7.2.可见变量情况

7.2.1.线程A和B同时修改i变量

7.2.2.A先获取到了i,在线程栈里i+1变成了2,这个时候只在线程栈里变成了2,实际变量没有变成2

7.2.3.这个时候,B也取变量i,此时取到的i是2,因为i是可见变量volatile,然后在线程栈里+1,这样B线程栈里3

7.2.4.这个时候如果B先放到主内存,变成3,A紧接着放到主内存又变成了2,因为A,B线程处理主内存的顺序是混乱的,取决于CPU分配线程的瞬时优先级

所以多线程下volatile是可以让结果更加准确的接近实际结果,但是取不到决定性的作用,并不是原子操作.多线程下变量安全方案,有两个

A.同步锁

B.使用AtomicInteger原子操作,线程安全




菜鸟交流群:260052172(大神莫入)

© 著作权归作者所有

下一篇: Ajax模板
BK灬

BK灬

粉丝 46
博文 345
码字总数 142921
作品 0
朝阳
后端工程师
私信 提问
最新阿里巴巴面试题(附带面试标准答案)

在上一节中,我们已经介绍了关于阿里巴巴的任职要求,这节我就详细的介绍一下关于阿里巴巴的面试题(涉及到标准代码部分不予以出现,如果想要可以加群:725479218,里面可以进行技术分享、技术...

柯西带你学编程
2018/06/02
0
0
并行、并发、多线程、多进程、协程到底啥关系?

认真把这些概念的关系梳理清楚,绝对是一件打根基的好事。作为自学计算机的人,越早明白这些基本概念,就越能提高自己的自学速度。 1、并行(Parallelism) 并行是说同一时刻做很多操作。多进...

milter
04/20
0
0
java 并发多线程 锁的分类概念介绍 多线程下篇(二)

java 并发多线程 锁的分类概念介绍 多线程下篇(二) 接下来对锁的概念再次进行深入的介绍 之前反复的提到锁,通常的理解就是,锁---互斥---同步---阻塞 其实这是常用的独占锁(排它锁)的概...

推荐码发放
03/07
0
0
1.通过线程门实现Java并发编程

【IT168 专稿】线程门(thread gate)模式是控制线程并发的一个有效工具,但是很多开发者对它并不熟悉。如同交通信号灯可以让汽车在十字路口有序通行一样,线程门可以根据给定条件阻止或允许线...

JavaGG
2010/03/24
287
0
确保线程安全的几种方法

对于基于Linux操作系统的开发者来说,多线程是一个在开发和面试中不可避免的、被广泛讨论的话题。最近,我被问到了一个和多线程有关的问题:如何确保线程安全?在刚听到这个问题的时候,我还...

zhouzxi
2017/07/10
0
0

没有更多内容

加载失败,请刷新页面

加载更多

parseint和isNaN用法

本文转载于:专业的前端网站➭parseint和isNaN用法 <!doctype html><html><head><meta charset="utf-8"><title>无标题文档</title></head><body><script> var a='12'; alert......

前端老手
56分钟前
7
0
Kylin 精确去重在用户行为分析中的妙用

作者:史少锋,Apache Kylin committer & PMC,2019/10/11 在上次文章《如何在 1 秒内做到大数据精准去重》中,我们介绍了 Apache Kylin 为什么要支持大数据集上的精确去重,以及基于 Bitmap...

ApacheKylin
今天
5
0
学习记录(二) es6基本语法(rest参数,模板化,axios模块,拦截器)

日常学习记录 模块化:把一个大文件分成多个小文件,按照一定规范进行拼接 es5写法: 导出:module.exports = 数据 导入:require("路径") /路径未添加后缀名时 //默认添加.js //把路径作为文件名...

Pole丶逐
今天
4
0
以程序员的角度怎么购买一台「性价比高的电视」

前俩天有小伙伴在我的文章下留言,说能否把 【国内电视机都介绍一下】,今天我已在TV端开发多年的程序员的角度。谈谈已程序员的角度如何购买一台性价比高的电视。 国内大的电视机品牌介绍 长...

我们都很努力着
今天
5
0
PhotoShop 色调:理解直方图/RGB通道信息

一、直方图:图表的形式,展示图像像素分布的情况 1.平均值:表示平均亮度 2.标准偏差值:表示亮度值范围内的中间值 3.像素: 表示用于计算直方图的像素总数 4.色阶:显示指针下面的区域亮度...

东方墨天
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部