最近需要实现一套多并发的事件处理模型,而且对某些事件的执行顺序是有要求的,同一个用户产生的事件需要保证执行的顺序性。在网上没找到相似的,准备自己实现。先对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

java7 ThreadPoolExecutor类详解——类结构-LMLPHP

ExecutorService提供了对线程池任务的停止,状态,任务提交,批量返回结果 接口方法

AbstractExecutorService

java7 ThreadPoolExecutor类详解——类结构-LMLPHP

粗略看AbstractExecutorService抽象类

增加了newTaskFor方法。引入了线程池中的任务对象,接口类RunableFuture和实现类FutureTask,这两个类可以单独展开。

实现了ExecutorService的submit和invokeAny和invokeAll方法,

    主要思想就是将runnable和callable的任务转化为FutureTask的任务,然后调用execute方法来执行。

还有shutdown和isTerminated等方法未实现。

目前的抽象类里面还没具体的extcute方法的实现,主要是实现了线程池需要的“任务提交”和“批量返回”的操作。这种设计思想主要是把一些辅助的方法都定义好,做到了即不影响实现者的核心业务实现,还避免了实现者对辅助方法的重复实现。

ThreadPoolExecutor

ThreadPoolExecutor类是最核心的业务实现类,继承了抽象类AbstractExecutorService

详解再开一篇。

12-18 16:59