文档章节

身为JAVA工作者必须了解的实战知识(五)

 叶荷
发布于 2017/08/28 20:19
字数 1729
阅读 9
收藏 0

一、 在线程中执行任务

无限制创建线程的不足

.线程生命周期的开销非常高

.资源消耗

.稳定性

二、Executor框架

Executor基于生产者-消费者模式,提交任务的操作相当于生产者,执行任务的线程则相当于消费者。

1. Executors 返回 ExecutorService

2. ExecutorService方法submit、execute

3. ExecutorService.submit 返回 Future

线程池,Executors方法介绍

方法名解释

newFixedThreadPool将创建一个固定长度的线程池,每当提交一个任务时就创建一个线程,知道达到线程池的最大数量,这时线程池的规模将不再变化(如果某个线程由于发生了未预期的Exception而结束,那么线程池会补充一个新的线程。)

newCachedThreadPool将创建一个可缓存的线程池,如果线程池的当前规模超过了处理需求时,那么将回收空闲的线程,而当需求增加时,则可以添加新的线程,线程池的规模不存在任何限制。

newSingleThreadExecutor将会创建一个单线程的Executor,它创建单个工作者线程来执行任务,如果这个线程异常结束,会创建另一个线程来替代。newSingleThreadExecutor能确保依照任务在队列中的顺序来串行执行(例如FIFO、LIFO、优先级)

newScheduledThreadPool创建了一个固定长度的线程池,而且以延迟或定时的方式来执行任务,类似于Timer。

Executor的生命周期

以上四个方法都会返回ExecutorService,ExecutorService的生命周期有3种状态:运行、关闭和已终止。

方法名解释

shutdown将执行平缓的关闭过程:不再接受新的任务,同时等待已经提交的任务执行完成—包括那些还未开始执行的任务。

shutdownNow将执行粗暴的关闭过程:它将尝试取消所有运行中的任务,并且不再启动队列中尚未开始执行的任务。

Timer类负责管理延迟任务

三、找出可利用的并行性

1. 任务拆分到多个子线程处理。

2. 携带结果的任务Callable与Futrue

Executor执行任务的4个生命周期:创建,提交,开始,完成。

任务的提交者和执行者之间的通讯手段

[java]view plaincopy

print?

ExecutorService executor = Executors.newSingleThreadExecutor();

Callable task =newCallable() {

publicObject call()throwsException {

Object result ="...";

returnresult;

}

};

Future future = executor.submit(task);

future.get();// 等待至完成

Future future = executor.submit(task);

// 等待到任务被执行完毕返回结果

// 如果任务执行出错,这里会抛ExecutionException

future.get();

//等待3秒,超时后会抛TimeoutException

future.get(3,  TimeUnit.SECONDS);

Callable task =newCallable() {

publicObject call()throwsException {

Object result = …;

returnresult;

}

};

有两种任务:

Runnable

Callable - 需要返回值的任务

Task Submitter把任务提交给Executor执行,他们之间需要一种通讯手段,这种手段的具体实现,通常叫做Future。Future通常包括get(阻塞至任务完成), cancel,get(timeout)(等待一段时间)

等等。Future也用于异步变同步的场景。

3、4. 在异构任务并行化中存在的局限

如果一个任务是读取IO资源,可以使用多个线程去同时读取,但是效率上限可能出在IO上,即使开启再多线程读取总速度也不可能超出IO读取速度上限。

开启多个线程本身也会调高编程难度,同时开启多个线程也会造成资源消耗。

多线程提高效率很多时候并不是增加一个线程效率提高一倍,可能提高的效率微乎其微。

5. Executor与BlockingQueue

如果想提交一组计算任务,并且希望在计算完成后获得结果,可以使用BlockingQueue保存每个任务的Future。

7. 为任务设置时限

//等待3秒,超时后会抛TimeoutException

future.get(3,  TimeUnit.SECONDS);

8. ExecutorService.invokeAll()

执行给定的任务,当所有任务完成时,返回保持任务状态和结果的 Future 列表。返回列表的所有元素的 Future.isDone() 为 true。注意,可以正常地或通过抛出异常来终止已完成 任务。如果正在进行此操作时修改了给定的 collection,则此方法的结果是不确定的。

四、资料:

《温绍锦 - Java并发程序设计教程》

摘录“任务的提交者和执行者”,“任务的提交者和执行者之间的通讯手段”

 

聊聊并发(三)——JAVA线程池的分析和使用(原理)

http://www.infoq.com/cn/articles/java-threadPool

Java(Android)线程池(使用)

http://www.trinea.cn/android/java-android-thread-pool/

Java Thread Pool Example using Executors and ThreadPoolExecutor

http://www.journaldev.com/1069/java-thread-pool-example-using-executors-and-threadpoolexecutor

工具可以查看线程数

jconsole.exe

以上就是我推荐给Java开发者们的一面试经典知识。但是这些知识里面并没有太多Java全栈、Java晋阶、JAVA架构之类的题,不是我不推荐,而是希望大家更多的从基本功做起,打好基础,太多复杂的内容一会儿也说不明白。

好了同学们,我能介绍的也都全部介绍完给你们了,如果下获得更多JAVA教学资源,可以选择来我们这里共同交流,群:240448376,很多大神在这里切磋学习,不懂可以直接问,晚上还有大牛免费直播教学。

注:加群要求

1、具有一定工作经验的,面对目前流行的技术不知从何下手,需要突破技术瓶颈的可以加,有些应届生和实习生也可以加。

2、在公司待久了,过得很安逸,但跳槽时面试碰壁。需要在短时间内进修、跳槽拿高薪的可以加。

3、如果没有工作经验,但基础非常扎实,对java工作机制,常用设计思想,常用java开发框架掌握熟练的,可以加。

4、觉得自己很牛B,一般需求都能搞定。但是所学的知识点没有系统化,很难在技术领域继续突破的可以加。

5.阿里Java高级大牛直播讲解知识点,分享知识,多年工作经验的梳理和总结,带着大家全面、科学地建立自己的技术体系和技术认知!

PS:现在主要讲解的内容是(反射原理枚举原理与应用注解原理常用设计模式、正规表达式高级应用、JAVA操作Office原理详解JAVA图像处理技术,等多个知识点的详解和实战)

6.小号或者小白之类加群一律不给过,谢谢。

最后,每一位读到这里的网友,感谢你们能耐心地看完。觉得对你有帮助可以给个喜欢!希望在成为一名更优秀的Java程序员的道路上,我们可以一起学习、一起进步

© 著作权归作者所有

共有 人打赏支持
粉丝 0
博文 24
码字总数 41519
作品 0
私信 提问
fbf的书单,欢迎分享,欢迎更新

本人看过的以下书值得推荐的,列出来的就是值得推荐的 这个颜色是一般推荐 这个颜色是强烈推荐 这个颜色是神作,收藏吧 物联网:生产力的变革 李虹著 开拓视野,一般 源码中国:全球IT外包新原...

fbf
2015/03/16
0
0
Python爱好者要明确的未来方向

了解Python是什么? Python 这门语言它是面向对象编程语言,有封装强大的类库,Python目前已经超过了Java成为人们最喜欢的编程语言。相比Java,Python更加的容易理解、免费开源的代码、Pytho...

糖宝lsh
09/20
0
0
阿里P8架构师总结的互联网Java架构系统化学习路线

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/t4i2b10X4c22nF6A/article/details/83181980 网络应用,最常见的研发语言是Java的和PHP。 后端服务,最常见的...

JAVA高级架构v
10/19
0
0
Java培训实战教程之Java基础知识精华部分(四)(五)

Java培训实战教程之Java基础知识精华部分(四)_设计模式 =============================================================================Java培训实战教程之Java基础知识精华部分(四)_设计模...

黑泽明军
04/13
0
0
Java微信开发_00_资源汇总贴

1.微信公众平台技术文档(https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1445241432) 2.微信企业号开发接口文档(http://qydev.weixin.qq.com/wiki/index.php?title=%E4%B8%BB%E......

rayner
2017/08/07
0
0

没有更多内容

加载失败,请刷新页面

加载更多

分布式锁的实现

redis实现分布式锁 方法1:普通实现方案 实现方式: 使用指令: set key 随机值 ex 5 nx.意思是当key不存在的时候设置key. 如果key存在返回OK,否则返回nil. 实现过程: 1.执行命令set key true ...

grace_233
21分钟前
1
0
解决CKEditor 4 富文本编辑器在图片组件无法显示[上传]选项卡的相关问题

关于解决CKEditor 4 富文本编辑器在图片组件无法显示[上传]选项卡的相关问题。 本文可能会对以下现象得以解决: 图片上传组件,没有 [上传] 选项卡。 资源无法加载 [imgupload] ( Uncaught E...

Eller
25分钟前
0
0
限制php解析、user_agent、php相关配置

11月20日任务 11.28 限定某个目录禁止解析php 11.29 限制user_agent 11.30/11.31 php相关配置 11.28、限定某个目录禁止解析php 核心配置文件内容 <Directory /data/wwwroot/www.123.com/upl...

zgxlinux
29分钟前
1
0
博客园首页新随笔联系订阅管理 随笔

注解Annotation实现原理与自定义注解例子 什么是注解? 对于很多初次接触的开发者来说应该都有这个疑问?Annontation是Java5开始引入的新特征,中文名称叫注解。它提供了一种安全的类似注释的...

onedotdot
47分钟前
4
1
Spring boot + redis 用RedisTemlate实现简单的String key value 操作

springboot集成redis, 简单的key, value缓存操作. 1. application-local.properties # redis on local#spring.redis.port=6379#spring.redis.host=localhost#spring.redis.password=......

园领T
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部