java中executorservice_JAVA ExecutorService的学习笔记

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

38cf07afe636

ExecutorService接口

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

38cf07afe636

ExecutorService的基本用法

执行的结果如下

38cf07afe636

ExecutorService的执行结果

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

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

boolean awaitTermination(long timeout, TimeUnit unit)

throws InterruptedException;

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

38cf07afe636

awaitTermination方法的使用

执行结果如下:

38cf07afe636

awaitTermination方法的执行结果

List> invokeAll(Collection> tasks)

throws InterruptedException;

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

38cf07afe636

invokeAll方法的执行

38cf07afe636

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

执行结果是:

38cf07afe636

invokeAll一个参数的执行结果

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

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

38cf07afe636

会超时的执行任务集合

结果是:

38cf07afe636

抛出

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);

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

38cf07afe636

绝望ing

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

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

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

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

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

然后,ThreadPoolExecutor、ScheduledThreadPoolExecutor是这个接口的实现类。

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

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

38cf07afe636

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

参考资料:

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

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

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

38cf07afe636

拜拜!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值