1.继承体系
starUML运行异常,和c盘存储或目录层次有关
2.API说明和经典例子
以下文字摘自Executor接口的Java API文档:
执行已提交的 Runnable
任务的对象。此接口提供一种将任务提交与每个任务将如何运行的机制(包括线程使用的细节、调度等)分离开来的方法。通常使用Executor 而不是显式地创建线程。例如,可能会使用以下方法,而不是为一组任务中的每个任务调用 new Thread(new(RunnableTask())).start():
Executor executor = anExecutor; executor.execute(new RunnableTask1()); executor.execute(new RunnableTask2()); ...不过, Executor 接口并没有严格地要求执行是异步的。在最简单的情况下,执行程序可以 在调用者的线程中立即运行已提交的任务:
class DirectExecutor implements Executor { public void execute(Runnable r) { r.run(); } }更常见的是,任务是 在某个不是调用者线程的线程中执行的。以下执行程序将为每个任务生成一个新线程。
class ThreadPerTaskExecutor implements Executor { public void execute(Runnable r) { new Thread(r).start(); } }许多 Executor 实现都对调度任务的方式和时间强加了某种限制。 以下执行程序使任务提交与第二个执行程序保持连续,这说明了一个复合执行程序。
class SerialExecutor implements Executor { final Queue<Runnable> tasks = new ArrayDeque<Runnable>(); final Executor executor; Runnable active; SerialExecutor(Executor executor) { this.executor = executor; } public synchronized void execute(final Runnable r) { tasks.offer(new Runnable() { public void run() { try { r.run(); } finally { scheduleNext(); } } }); if (active == null) { scheduleNext(); } } protected synchronized void scheduleNext() { if ((active = tasks.poll()) != null) { executor.execute(active); } } }此包中提供的 Executor 实现实现了
ExecutorService
,这是一个使用更广泛的接口。
ThreadPoolExecutor
类提供一个可扩展的线程池实现。
Executors
类为这些 Executor 提供了便捷的工厂方法。
内存一致性效果:线程中将 Runnable
对象提交到 Executor
之前的操作 happen-before 其执行开始(可能在另一个线程中)。
以下文字摘自ExecutorService的Java API文档:
Executor
提供了管理终止的方法,以及可为跟踪一个或多个异步任务执行状况而生成Future
的方法。
可以关闭 ExecutorService,这将导致其拒绝新任务。提供两个方法来关闭 ExecutorService。shutdown()
方法在终止前允许执行以前提交的任务,而shutdownNow()
方法阻止等待任务启动并试图停止当前正在执行的任务。在终止时,执行程序没有任务在执行,也没有任务在等待执行,并且无法提交新任务。应该关闭未使用的ExecutorService 以允许回收其资源。
通过创建并返回一个可用于取消执行和/或等待完成的 Future
,方法 submit 扩展了基本方法 Executor.execute(java.lang.Runnable)
。方法 invokeAny 和invokeAll 是批量执行的最常用形式,它们执行任务 collection,然后等待至少一个,或全部任务完成(可使用 ExecutorCompletionService
类来编写这些方法的自定义变体)。
Executors
类提供了用于此包中所提供的执行程序服务的工厂方法。
Executors.newFixedThreadPool(int)
工厂方法:
class NetworkService implements Runnable { private final ServerSocket serverSocket; private final ExecutorService pool; public NetworkService(int port, int poolSize) throws IOException { serverSocket = new ServerSocket(port); pool = Executors.newFixedThreadPool(poolSize); } public void run() { // run the service try { for (;;) { pool.execute(new Handler(serverSocket.accept())); } } catch (IOException ex) { pool.shutdown(); } } } class Handler implements Runnable { private final Socket socket; Handler(Socket socket) { this.socket = socket; } public void run() { // read and service request on socket } }
3.具体知识点与简单例子
以下是ExecutorService启动多线程执行任务的最简单用法,摘自Java编程思想:
不同的线程池: