美文网首页
JAVA ExecutorService的学习笔记

JAVA ExecutorService的学习笔记

作者: 红鱼丶 | 来源:发表于2017-12-07 14:19 被阅读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

    拜拜!

    相关文章

      网友评论

          本文标题:JAVA ExecutorService的学习笔记

          本文链接:https://www.haomeiwen.com/subject/gnfdixtx.html