Java 多线程编程设计模式 Active Object

Active Object 模式是一种异步编程模式,它通过对方法的调用(Method Invocation) 与方法的执行(Method Execution) 进行解耦(Decoupling) 来提高并发性。若以任务的概念来说,Active Object 模式的核心则是它允许任务的提交(相当于对异步方法的调用)和任务的执行(相当与异步方法的真正执行)分离。 类似于System.gc(), System.gc() 的调用方代码是运行在自己的线程上(通常是main 线程派生的子线程),而Jvm 的垃圾回收这个动作则是由专门的工作者线程(垃圾回收线程)执行。换言之,其调用方和允许是在不同的线程中的,从而提高了并发性。

Active Object 的参与者有6个之多,其实现过程也包含了不少中间的处理: MethodRequest 对象的生成、MethodRequest 对象的移动(进出缓冲区)、MethodRequest 对象的运行调度和线程上下文切换等。这些处理都有其空间和时间的代价。因此,Active Object 模式适合于分解一个比较耗时的任务(如涉及I/O操作的任务):将任务的发起和执行进行分离,以减少不必要的等待时间。

参与者名称 可以借用的JDK 类 说明
Scheduler java.util.concurrent.ExecutorService 接口的相关实现类 ExecutorService 接口所定义的submit(Callable task)方法相当于enqueue方法
ActivationQueue java.util.concurrent.LinkedBlockingQueue java.util.concurrent.LinkedBlockingQueue 实例作为ThreadPool Executor 的构造器
MehthodRequest java.util.concurrent.Callable 接口的实现类 Callable 接口比起Runnable 接口的优势在于它定义的call 方法有返回值,便于将该返回值传递给Future 实例,通常使用Callable 接口的匿名实现类即可

| Future | java.util.concurrent.Future | ExecutorService 接口所定义的submit(Challable task) 方法的返回值类型就是 java.util.concurrent.Future

8.4.1 错误隔离(一个任务的处理失败不影响其他任务的处理)

选用JDK 中现成的类(如ThreadPoolExecutor) 来实现Scheduler 的一个好处就是这些类可能已经实现了错误隔离。

8.4.3 缓冲区饱和处理策略

java.util.concurrent.RejectedExercutionHandler 接口是ThreadPoolExector 对缓冲区饱和处理策略的抽象。JDK 提供的缓冲区饱和处理策略实现类有

8.4.4 Scheduler 空闲工作者线程清理

猜你喜欢

转载自blog.csdn.net/lilele12211104/article/details/78769808