Executor、ExecutorService、Future、FutureTask、Future、Callable、Lock、Condition

Future,Callable,FutureTask

Future 表示 一个任务的生命周期,并提供了相应的方法来判断是否已经完成或取消,以及获取任务的结果和取消任务等。

Callable是一种更好的抽象,它认为主入口点(call())返回一个值,并可能抛出一个异常。

Callable接口与Future接口

1
2
3
4
5
6
7
8
9
10
11
public interface Callable<V>{
V call() throws Exception;
}

public interface Future<V>{
boolean cancel(boolean mayInterruptIfRunning);
boolean isCancelled();
boolean isDone();
V get() throws Exception ;
V get(lont timeout,TimeUnit unit) throws Exception ;
}

还可以显示地为某个指定的Runnable或Callable实例化一个FutureTask。
(由于FutureTask实现了Runnable,因此可以将它提交给Executor来执行)。

Executor接口,子接口有ExecutorService和ScheduleExecutorService

Executor是任务执行框架,大多数的并发应用都是围绕任务执行来构造的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public interface Executor {

/**
* Executes the given command at some time in the future. The command
* may execute in a new thread, in a pooled thread, or in the calling
* thread, at the discretion of the {@code Executor} implementation.
*
* @param command the runnable task
* @throws RejectedExecutionException if this task cannot be
* accepted for execution
* @throws NullPointerException if command is null
*/
void execute(Runnable command);
}

//Executor的子接口,只列出一些常用的方法
public interface ExecutorService extends Executor{
void shutdown;
List<Runnable> shutdownNow();
boolean isShutdown();
<T> Future<T> submit(Callable<T> task);
<T> Future<T> submit(Runnable task, T result);
Future<?> submit(Runnable task);
}

//ScheduleExecutorService可调度的线程

ExecutorService中所有submit方法都返回一个Future,从而将一个Runnable或Callable提交给Executor,并得到一个Future用来获取任务的执行结果或者取消任务。

Executors,通过该类的静态方法,返回线程池的执行框架。

如:

  • newFixedThreadPool(int nThreads) 固定大小的线程池
  • newSingleThreadExecutor() 单线程池
  • newCachedThreadPool() 可缓存的线程池
  • newScheduledThreadPool(int nThreads) 创建一个定长,支持调度的线程池

Lock,Condition

Lock提供了一种可轮询的,定时的以及可中断的锁获取操作,所有加锁和解锁的方法都是显式的。(lock() unlock())

Condition是一种广义上的内置条件队列,定义了等待通知方法,可用于线程间的同步。

参考资料:《Java并发编程实战》

并发编程