今天看到《Java并发编程实战》第六章的时候,书中讲了利用Executor框架来实现多线程,平时Executor用得不多,今天顺带学习了一下,写出来总结总结。
引入Executor框架的原因
两种多线程执行任务的策略:
1.串行执行,即每次线程运行完才会运行下一个线程。这种方法是线程安全的,但是效率低,吞吐量小
2.为每个任务开辟一个线程,例如为每个请求服务器的连接建立一个线程,这种方法开销大(频繁地创建和销毁线程消耗大量资源,线程之间互相争夺处理资源等)以及有稳定性因素(线程的数量限制)
为了可以实现线程重用,对线程进行统一的管理,控制线程的数量,采用了线程池的方法。
使用方法
一、Executor框架使用Runnable作为其基本任务的表现形式
先看几个用到的接口(Executor,ExecutorService)
Executor接口
public interface Executor {
void execute(Runnable command);
}
只要传入Runnable接口,调用execute方法即可开启线程。
ExecutorService接口(继承自Executor)
public interface ExecutorService extends Executor {
void shutdown();
List<Runnable> shutdownNow();
boolean isShutdown();
boolean isTerminated();
boolean awaitTermination(long timeout, TimeUnit unit)
throws InterruptedException;
<T> Future<T> submit(Callable<T> task);
<T> Future<T> submit(Runnable task, T result);
Future<?> submit(Runnable task);
<T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks)
throws InterruptedException;
<T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks,
long timeout, TimeUnit unit)
throws InterruptedExcepti