ExecutorService是Java中对线程池定义的一个接口,它java.util.concurrent包中,在这个接口中定义了和后台任务执行相关的方法:
这上面的为一个java线程池接口接口的接口,首先介绍它的基本用法:
执行的结果如下
可以看到,循环提交20个线程后,线程的执行是四个四个的执行并且执行了五次;如果在提交完成后shutdown,则之前提交的线程仍然会执行。
接下来分别介绍这上面的方法:
boolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedException;
这个方法有两个参数,一个是timeout即超时时间,另一个是unit即时间单位。这个方法会使线程等待timeout时长,当超过timeout时间后,会监测ExecutorService是否已经关闭,若关闭则返回true,否则返回false。一般情况下会和shutdown方法组合使用。如下:
执行结果如下:
List> invokeAll(Collection> tasks) throws InterruptedException;
这个方法的参数是一个任务的集合,该方法会堵塞,必须等待所有任务结束后统一返回,内存持有时间长,响应时间长。代码如下:
执行结果是:
List> invokeAll(Collection? extends Callable tasks, long timeout, TimeUnit unit) throws InterruptedException;
该方法有三个参数,第一个是任务的集合,第二个是超时时间,第三个是时间的单位,比如TimeUnit.MILLISECONDS 表示秒钟。然后超时时间结束后还没有执行的任务,会超时不执行并且抛出异常,如下图:
结果是:
下面的方法是线程中睡眠出现的异常
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);
提交任务,后面那个参数我也不知道是什么玩意儿,,后台说:不要看反编译的,反编译的不准!你知道是提交不就完了,源码看不懂~!
好了,就这样了,反正知道ExecutorService是线程池的东东,然后用Executors来实例化,有四种方式,分别是:
1. newCachedThreadPool 创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
2. newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
3. newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。
4. newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。
然后,ThreadPoolExecutor、ScheduledThreadPoolExecutor是这个接口的实现类。
然后用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