最近需要实现一套多并发的事件处理模型,而且对某些事件的执行顺序是有要求的,同一个用户产生的事件需要保证执行的顺序性。在网上没找到相似的,准备自己实现。先对java提供的线程池模型有一个深度的了解,看一下ThreadPoolExecutor。
ThreadPoolExecutor的继承结构如下:
class ThreadPoolExecutor extends AbstractExecutorService
abstract class AbstractExecutorService implements ExecutorService
interface ExecutorService extends Executor
interface Executor
Executor
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); }
一个执行提交的runnable任务的对象。这个接口提供了一种解耦任务的提交和执行的方式。它替代了那种显式的创建线程执行的方式
new Thread(new(RunnableTask())).start()
ExecutorService
ExecutorService提供了对线程池任务的停止,状态,任务提交,批量返回结果 接口方法
AbstractExecutorService
粗略看AbstractExecutorService抽象类
增加了newTaskFor方法。引入了线程池中的任务对象,接口类RunableFuture和实现类FutureTask,这两个类可以单独展开。
实现了ExecutorService的submit和invokeAny和invokeAll方法,
主要思想就是将runnable和callable的任务转化为FutureTask的任务,然后调用execute方法来执行。
还有shutdown和isTerminated等方法未实现。
目前的抽象类里面还没具体的extcute方法的实现,主要是实现了线程池需要的“任务提交”和“批量返回”的操作。这种设计思想主要是把一些辅助的方法都定义好,做到了即不影响实现者的核心业务实现,还避免了实现者对辅助方法的重复实现。
ThreadPoolExecutor
ThreadPoolExecutor类是最核心的业务实现类,继承了抽象类AbstractExecutorService
详解再开一篇。