JAVA ExecutorService的学习笔记

ExecutorService是Java中对线程池定义的一个接口,它java.util.concurrent包中,在这个接口中定义了和后台任务执行相关的方法:

ExecutorService接口

这上面的为一个java线程池接口接口的接口,首先介绍它的基本用法:

ExecutorService的基本用法

执行的结果如下


ExecutorService的执行结果

可以看到,循环提交20个线程后,线程的执行是四个四个的执行并且执行了五次;如果在提交完成后shutdown,则之前提交的线程仍然会执行。

接下来分别介绍这上面的方法:

boolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedException;

    这个方法有两个参数,一个是timeout即超时时间,另一个是unit即时间单位。这个方法会使线程等待timeout时长,当超过timeout时间后,会监测ExecutorService是否已经关闭,若关闭则返回true,否则返回false。一般情况下会和shutdown方法组合使用。如下:

awaitTermination方法的使用

    执行结果如下:

awaitTermination方法的执行结果

List> invokeAll(Collection> tasks) throws InterruptedException;

    这个方法的参数是一个任务的集合,该方法会堵塞,必须等待所有任务结束后统一返回,内存持有时间长,响应时间长。代码如下:

invokeAll方法的执行
MyTask类的内容,返回的temp为后来future的get()方法获取到的值

执行结果是:


invokeAll一个参数的执行结果

List> invokeAll(Collection? extends Callable tasks, long timeout, TimeUnit unit) throws InterruptedException;

该方法有三个参数,第一个是任务的集合,第二个是超时时间,第三个是时间的单位,比如TimeUnit.MILLISECONDS 表示秒钟。然后超时时间结束后还没有执行的任务,会超时不执行并且抛出异常,如下图:

会超时的执行任务集合

结果是:

抛出 CancellationException 

下面的方法是线程中睡眠出现的异常

T invokeAny(Collection? extends Callable tasks) throws InterruptedException, ExecutionException;

该方法有三种情况:

    1、一旦有1个任务正常完成(执行过程中没有抛异常),线程池会终止其他未完成的任务

    2、如果提交的任务列表中,没有1个正常完成的任务,那么调用invokeAny会抛异常,究竟抛的是哪儿个任务的异常,无关紧要

    3、invokeAny()和任务的提交顺序无关,只是返回最早正常执行完成的任务

T invokeAny(Collection? extends Callable tasks, long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException;

    该方法表示执行任务列表,返回最早结束的正常执行的任务,如果超时,则不返回并且报错。

boolean isShutdown();

    这个方法在ExecutorService关闭后返回true,否则返回false。方法比较简单不再举例。

boolean isTerminated();

    这个方法会校验ExecutorService当前的状态是否为“TERMINATED”即关闭状态,当为“TERMINATED”时返回true否则返回false

void shutdown();  

    这个方法会平滑地关闭ExecutorService,当我们调用这个方法时,ExecutorService停止接受任何新的任务且等待已经提交的任务执行完成(已经提交的任务会分两类:一类是已经在执行的,另一类是还没有开始执行的),当所有已经提交的任务执行完毕后将会关ExecutorService。

List shutdownNow();

    试图停止当前正执行的task,并返回尚未执行的task的list。

Future submit(Callabletask);

    提交任务,接下来去执行;

Future submit(Runnable task);

    提交一个线程,会在内部转换成任务

Future submit(Runnable task, T result);    

    提交任务,后面那个参数我也不知道是什么玩意儿,,后台说:不要看反编译的,反编译的不准!你知道是提交不就完了,源码看不懂~!


绝望ing




好了,就这样了,反正知道ExecutorService是线程池的东东,然后用Executors来实例化,有四种方式,分别是:

    1. newCachedThreadPool 创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。

    2. newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。

    3. newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。

    4. newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。

然后,ThreadPoolExecutorScheduledThreadPoolExecutor是这个接口的实现类。

然后用submit进行提交,提交过去后就会按照最大的线程数进行执行,多了就等待下次执行,然后想执行完了就干掉这个线程池用shutdown,如果想努力现在就干掉线程池就用shutdownnow,返回的是没有执行的task集合。。。

嗯。。。总感觉还没写完,算了,,就这样了,反正作为安卓开发能用到线程池的东西又不多

好紧张,又写了一篇没人看的文章

参考资料:

http://blog.csdn.net/suifeng3051/article/details/49443835

http://blog.csdn.net/aitangyong/article/details/38172189

http://blog.csdn.net/zmx729618/article/details/51436594

拜拜!
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335

推荐阅读更多精彩内容

  • layout: posttitle: 《Java并发编程的艺术》笔记categories: Javaexcerpt...
    xiaogmail阅读 5,766评论 1 19
  • 为什么引入Executor线程池框架 new Thread()的缺点每次new Thread()耗费性能 调用ne...
    牧童遥指2000阅读 2,150评论 1 5
  • 一、并发 进程:每个进程都拥有自己的一套变量 线程:线程之间共享数据 1.线程 Java中为多线程任务提供了很多的...
    SeanMa阅读 2,373评论 0 11
  • 太多人都比我们优秀了 但我们还开心的活着啊 只看自己 加油 你一定会做好的 因为在我心中你最好
    夏筱晨阅读 125评论 0 0
  • 晚上邀欧巴桑一家来吃饭,张罗了一下午,炒馅、包汤包。一窝蜂的人来,闹闹哄哄一阵,忙活了一晚上,做饭的人却最后一个吃...
    丛阑阅读 268评论 1 8