JAVA ExecutorService的学习笔记

2017-12-07  本文已影响0人  红鱼丶

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

拜拜!
上一篇下一篇

猜你喜欢

热点阅读