Java多线程与并发05: Executors

使用Executor

 

使用executor可以实现类似与Thread的方法开辟线程:

使用execute方法执行一个Runnable接口的实现。但是存在很多限制:

1. 无法获取返回值

2. 无法知道运行的进度,无法取消任务。

3. 无法执行批量的任务。

4. 无法终止线程。

 

ExecutorService

 

boolean awaitTermination(long timeout, TimeUnit unit)

等待线程完成,当调用shutdown或超时时间到了或被意外中断了线程,线程退出返回true,超时返回false

 

List> invokeAll(Collection> tasks)

执行所有的任务,并返回一个List>的集合

 

List> invokeAll(Collection> tasks, long timeout, TimeUnit unit)

带有超时时间的执行所有的任务,并返回一个List>的集合,超时后,未执行完成的任务将被取消。

 

T invokeAny(Collection> tasks)

执行所有的任务,并返回一个执行成功的结果。未完成的将被取消。

 

T invokeAny(Collection> tasks, long timeout, TimeUnit unit)

带有超时时间的执行所有的任务,并返回一个执行成功的结果。未完成的将被取消。

 

boolean isShutdown()

判断是否被停止。

 

boolean isTerminated()

调用shutdown或shutdownNow后是否执行完成。

 

void shutdown()

终止任务的执行,不再接受新的任务。

 

List shutdownNow()

尽最大努力停止当前执行的任务,并中断等待的任务。

 

Future submit(Callable task)

提交一个异步任务,返回一个对应的Future对象。

 

Future submit(Runnable task)

提交一个异步任务,返回一个对应的Future对象。

 

Future submit(Runnable task, T result)

提交一个异步任务,返回一个对应的Future对象。成功执行,该对象的get方法返回值为result

 

Future

 

表示一个Task的未来控制对象,维护任务状态,获取任务的结果,判断任务是否完成等等。

 

boolean cancel(boolean mayInterruptIfRunning)

取消任务,参数表示是否中断线程。

 

V get()

阻塞并等待任务执行的返回值

 

V get(long timeout, TimeUnit unit)

带有超时的阻塞并等待任务执行的返回值

 

boolean isCancelled()

是否被取消

 

boolean isDone()

是否结束(正常结束,异常,被取消)

 

ExecutorService使用方法

 

Java多线程与并发05: Executors_第1张图片

使用executorService实例的submit提交任务,使用任务的get方法阻塞获取结果。

 

Executors

 

此类提供的静态方法可以提供ExecutorService的实现:

1. ExecutorService

2. ScheduledExecutorService

3. ThreadFactory

 

例如,static ExecutorService newFixedThreadPool(int nThreads)

创建固定线程个数的线程池,当所有的线程都在运行,新提交的任务需要在线程池的队列中等待。

 

使用ExecutorService提交任务

 

Java多线程与并发05: Executors_第2张图片

Java多线程与并发05: Executors_第3张图片

这里使用newFixedThreadPool创建了一个线程池,创建了一个Callable实现。

Java多线程与并发05: Executors_第4张图片

这里使用executorService的submit方法提交了一个任务,返回一个Future对象。

使用isDone判断线程是否完成(正常完成、异常或取消)

使用get获取执行结果

使用shutdownNow停止线程池。

 

 

 

 

你可能感兴趣的:(多线程与并发)