Active Objects模式
实现的思路是,通过代理将方法的调用转变为向阻塞队列中添加一个请求,由一个线程取出请求后执行实际的方法,然后将结果设置到Future中

这里用到了代理模式,Future模式
/**************************************
* 接受异步消息的主动对象
*
**/
public interface ActiveObject { Result makeString(int count,char fillChar); void displayString(String text);
}
/*
* 主动对象的实现类
*
*/
class Servant implements ActiveObject { @Override
public Result makeString(int count, char fillChar) {
char[] buf = new char[count];
for (int i = ; i < count; i++) {
buf[i] = fillChar;
}
try {
Thread.sleep();
} catch (Exception e) { }
return new RealResult(new String(buf));
} @Override
public void displayString(String text) {
try {
Thread.sleep();
System.out.println("Display:" + text);
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* 主动对象的代理类
*
*/
class ActiveObjectProxy implements ActiveObject { private final SchedulerThread schedulerThread; private final Servant servant; public ActiveObjectProxy(SchedulerThread schedulerThread, Servant servant) {
this.schedulerThread = schedulerThread;
this.servant = servant;
} @Override
public Result makeString(int count, char fillChar) {
FutureResult future = new FutureResult();
//往队列里添加调用请求MethodRequest
schedulerThread.invoke(new MakeStringRequest(servant, future, count, fillChar));
return future;
} @Override
public void displayString(String text) {
schedulerThread.invoke(new DisplayStringRequest(servant, text));
}
}
/**
* 工具类
*/
public final class ActiveObjectFactory { private ActiveObjectFactory() {
} public static ActiveObject createActiveObject() {
Servant servant = new Servant();
ActivationQueue queue = new ActivationQueue();
SchedulerThread schedulerThread = new SchedulerThread(queue);
ActiveObjectProxy proxy = new ActiveObjectProxy(schedulerThread,servant);
schedulerThread.start();
return proxy;
}
}
/**
*
* 调度者,从队列里取出任务并执行
*
*/
public class SchedulerThread extends Thread { private final ActivationQueue activationQueue; public SchedulerThread(ActivationQueue activationQueue) {
this.activationQueue = activationQueue;
} public void invoke(MethodRequest request) {
this.activationQueue.put(request);
} @Override
public void run() {
while (true) {
activationQueue.take().execute();
}
}
}
/***
* 阻塞队列
*/
public class ActivationQueue { private final static int DEFAULT_SIZE = ; private final LinkedList<MethodRequest> methodQueue; public ActivationQueue() {
methodQueue = new LinkedList<>();
} public synchronized void put(MethodRequest request) {
while (methodQueue.size() >= DEFAULT_SIZE) {
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
this.methodQueue.addLast(request);
this.notifyAll();
} public synchronized MethodRequest take() {
while (methodQueue.isEmpty()) {
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
MethodRequest methodRequest = methodQueue.removeFirst();
this.notifyAll();
return methodRequest;
}
}
/**
* 返回结果
*
*/
public interface Result { Object getResultValue(); }
/**
* 返回的对象
*/
public class RealResult implements Result { private final Object resultValue; public RealResult(Object resultValue) {
this.resultValue = resultValue;
} @Override
public Object getResultValue() {
return this.resultValue;
}
}
/**
*
* 实际返回给客户的result
*
*/
public class FutureResult implements Result { private Result result; private boolean ready = false; public synchronized void setResult(Result result) {
this.result = result;
this.ready = true;
this.notifyAll();
} @Override
public synchronized Object getResultValue() {
while (!ready) {
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return this.result.getResultValue();
}
}
/**
* 调用请求
*/
public abstract class MethodRequest { protected final Servant servant; protected final FutureResult futureResult; public MethodRequest(Servant servant, FutureResult futureResult) {
this.servant = servant;
this.futureResult = futureResult;
} public abstract void execute();
}
/**
*
* 拼接字符
*/
public class MakeStringRequest extends MethodRequest { private final int count;
private final char fillChar; public MakeStringRequest(Servant servant, FutureResult futureResult, int count, char fillChar) {
super(servant, futureResult);
this.fillChar = fillChar;
this.count = count;
} @Override
public void execute() {
Result result = servant.makeString(count, fillChar);
futureResult.setResult(result);
}
}
/**
* 打印字符串
*
*/
public class DisplayStringRequest extends MethodRequest { private final String text; public DisplayStringRequest(Servant servant, final String text) {
super(servant, null);
this.text = text;
} @Override
public void execute() {
this.servant.displayString(text);
}
}
public class Test {
public static void main(String[] args) {
ActiveObject activeObject = ActiveObjectFactory.createActiveObject();
activeObject.displayString("VVVVVVVVVV");
Result makeString = activeObject.makeString(, 'A');
System.out.println("#################");
System.out.println(makeString.getResultValue());
}
}
Active Objects模式的更多相关文章
- Java多线程编程模式实战指南:Active Object模式(下)
Active Object模式的评价与实现考量 Active Object模式通过将方法的调用与执行分离,实现了异步编程.有利于提高并发性,从而提高系统的吞吐率. Active Object模式还有个 ...
- java Active Object模式(下)
Active Object模式的评价与实现考量 Active Object模式通过将方法的调用与执行分离,实现了异步编程.有利于提高并发性,从而提高系统的吞吐率. Active Object模式还有个 ...
- Java多线程编程模式实战指南(一):Active Object模式--转载
本文由黄文海首次发布在infoq中文站上:http://www.infoq.com/cn/articles/Java-multithreaded-programming-mode-active-obj ...
- 敏捷软件开发(3)---COMMAND 模式 & Active Object 模式
COMMAND 模式 command模式非常简单,简单到你无法想象的地方. public interface Command { void execute(); } 这就是一个command模式的样子 ...
- Android开源库--ActiveAndroid(active record模式的ORM数据库框架)
Github地址:https://github.com/pardom/ActiveAndroid 前言 我一般在Android开发中,几乎用不到SQLlite,因为一些小数据就直接使用Preferen ...
- Java多线程编程模式实战指南:Active Object模式(上)
Active Object模式简介 Active Object模式是一种异步编程模式.它通过对方法的调用与方法的执行进行解耦来提高并发性.若以任务的概念来说,Active Object模式的核心则是它 ...
- java Active Object模式(上)
Active Object模式简介 Active Object模式是一种异步编程模式.它通过对方法的调用与方法的执行进行解耦来提高并发性.若以任务的概念来说,Active Object模式的核心则是它 ...
- Java多线程编程模式实战指南一:Active Object模式(下)
Active Object模式的评价与实现考量 Active Object模式通过将方法的调用与执行分离,实现了异步编程.有利于提高并发性,从而提高系统的吞吐率. Active Object模式还有个 ...
- Java多线程编程模式实战指南一:Active Object模式(上)
Active Object模式简介 Active Object模式是一种异步编程模式.它通过对方法的调用与方法的执行进行解耦来提高并发性.若以任务的概念来说,Active Object模式的核心则是它 ...
随机推荐
- Django rest_fram_work API View序列化
APIview 单表的GET和POST: 视图 查询所有: class PublishView(APIView): # 查询数据 def get(self, request): # first inq ...
- [SPOJ] DIVCNT2 - Counting Divisors (square) (平方的约数个数前缀和 容斥 卡常)
题目 vjudge URL:Counting Divisors (square) Let σ0(n)\sigma_0(n)σ0(n) be the number of positive diviso ...
- c++ 字符串相加
1. append string a= "xxx"; string b="yyy"; a.append(b); 结果 a = “xxxyyy”;
- callbag js callback 标准-支持轻量级观测以及迭代
callbag 是一个js 的回调标准,方便开发支持观测以及迭代的代码 类似已经有好多的实现了 callbag-basics 比rxjs 以及xstream 还快 wonka 说明 基于标准的开发,对 ...
- shell脚本编程基础知识点
整数比较: -eq:测试两个整数是否相等:相等为真,不等为假 -ne:测试两个整数是否不等:不等为真,相等为假 -gt:测试一个数是否大于另一个数:大于为真,否则为假 -lt:测试一个数是否小于另一个 ...
- 表单提交 curl和浏览器方式
表单被提交时,每个表单域都会被Url编码之后才在被发送. 浏览器每次向服务器发送url时,会进行编码,然后web服务器再进行解码. 所以,理论上,curl模拟登陆时,所传参数都必须urlencode一 ...
- 使用python3完成人脸识别
原文地址:https://www.jb51.net/article/160197.htm 第一种: # -*- coding:utf-8 -*- import cv2 as cv import num ...
- Prometheus监控神技--自动发现配置
一.自动发现类型 在上一篇文中留了一个坑: 监控某个statefulset服务的时候,我在service文件中定义了个EP,然后把pod的ip写死在配置文件中,这样,当pod重启后,IP地址变化,就监 ...
- Scala函数柯里化(Currying or Curry)
柯里化(Currying) 把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术. 简单的实现如下: scala> def ...
- 2019软工实践_Alpha(事后诸葛亮)
组长博客 感谢组长 总结思考 设想和目标 我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? 弥补Powerpoint中模板转换存在的缺陷,完善PPT模板一键转换的功能 ...