Executor框架的成员
(1)ThreadPoolExecutor |
---|
ThreadPoolExecutor通常使用工厂类Executors 来创建。 |
Executors可以创建3种类型的ThreadPoolExecutor:SingleThreadExecutor 、FixedThreadPool 和CachedThreadPool 。 |
|
1) FixedThreadPool 。下面是Executors提供的,创建使用固定线程数的FixedThreadPool的API。 |
public static ExecutorService newFixedThreadPool(int nThreads) |
public static ExecutorService newFixedThreadPool(int nThreads, ThreadFactorythreadFactory) |
FixedThreadPool适用于为了满足资源管理的需求,而需要限制当前线程数量的应用场景,它适用于负载比较重的服务器。 |
|
2) SingleThreadExecutor 。下面是Executors提供的,创建使用单个线程的SingleThread-Executor的API。 |
public static ExecutorService newSingleThreadExecutor() |
public static ExecutorService newSingleThreadExecutor(ThreadFactory threadFactory) |
SingleThreadExecutor适用于需要保证顺序地执行各个任务;并且在任意时间点,不会有多个线程是活动的应用场景。 |
|
3) CachedThreadPool 。下面是Executors提供的,创建一个会根据需要创建新线程的CachedThreadPool的API。 |
public static ExecutorService newCachedThreadPool() |
public static ExecutorService newCachedThreadPool(ThreadFactory threadFactory) |
CachedThreadPool是大小无界的线程池,适用于执行很多的短期异步任务的小程序,或者是负载较轻的服务器。 |
(2)ScheduledThreadPoolExecutor |
---|
ScheduledThreadPoolExecutor通常使用工厂类Executors 来创建。 |
Executors可以创建2种类型的ScheduledThreadPoolExecutor,ScheduledThreadPoolExecutor ,SingleThreadScheduledExecutor |
|
下面是工厂类Executors提供的,创建固定个数线程的ScheduledThreadPoolExecutor的API。 |
public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) |
public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize,ThreadFactory threadFactory) |
ScheduledThreadPoolExecutor适用于需要多个后台线程执行周期任务,同时为了满足资源管理的需求而需要限制后台线程的数量的应用场景。 |
|
下面是Executors提供的,创建单个线程的SingleThreadScheduledExecutor的API。 |
public static ScheduledExecutorService newSingleThreadScheduledExecutor() |
public static ScheduledExecutorService newSingleThreadScheduledExecutor(ThreadFactory threadFactory) |
SingleThreadScheduledExecutor适用于需要单个后台线程执行周期任务,同时需要保证顺序地执行各个任务的应用场景。 |
(3)Future接口 |
---|
Future接口和实现Future接口的FutureTask类用来表示异步计算的结果。当我们把Runnable接口或Callable接口的实现类提交(submit)给ThreadPoolExecutor或ScheduledThreadPoolExecutor时,ThreadPoolExecutor或ScheduledThreadPoolExecutor会向我们返回一个FutureTask对象。下面是对应的API。 |
<T> Future<T> submit(Callable<T> task) |
<T> Future<T> submit(Runnable task, T result) |
Future<> submit(Runnable task) |
有一点需要读者注意,到目前最新的JDK 8为止,Java通过上述API返回的是一个FutureTask对象。但从API可以看到,Java仅仅保证返回的是一个实现了Future接口的对象。在将来的JDK实现中,返回的可能不一定是FutureTask。 |
(4)Runnable接口和Callable接口 |
---|
Runnable接口和Callable接口的实现类,都可以被ThreadPoolExecutor或Scheduled-ThreadPoolExecutor执行。它们之间的区别是Runnable不会返回结果,而Callable可以返回结果。 |
|
除了可以自己创建实现Callable接口的对象外,还可以使用工厂类Executors来把一个Runnable包装成一个Callable。 |
下面是Executors提供的,把一个Runnable包装成一个Callable的API。 |
public static Callable<Object> callable(Runnable task) // 假设返回对象Callable1 |
下面是Executors提供的,把一个Runnable和一个待返回的结果包装成一个Callable的API。 |
public static <T> Callable<T> callable(Runnable task, T result) // 假设返回对象Callable2 |
|
前面讲过,当我们把一个Callable对象(比如上面的Callable1或Callable2)提交给ThreadPoolExecutor或ScheduledThreadPoolExecutor执行时,submit(…)会向我们返回一个FutureTask对象。我们可以执行FutureTask.get()方法来等待任务执行完成。当任务成功完成后FutureTask.get()将返回该任务的结果。例如,如果提交的是对象Callable1,FutureTask.get()方法将返回null ;如果提交的是对象Callable2,FutureTask.get()方法将返回result对象 。 |
-----------------------------------------------------------------------------读书笔记摘自 书名:Java并发编程的艺术 作者:方腾飞;魏鹏;程晓明