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模式的核心则是它 ...
随机推荐
- 【洛谷P5050】 【模板】多项式多点求值
code: #include <bits/stdc++.h> #define ll long long #define ull unsigned long long #define set ...
- WinDbg常用命令系列---检查符号X
x (Examine Symbols) x命令在所有与指定模式匹配的上下文中显示符号. x [Options] Module!Symbol x [Options] * 参数: Options特定符号搜 ...
- windbg命令行选项
我们不仅可以通过GUI的方式使用Windbg,还可以通过命令行的方式使用它,且在有些需求和使用场景下,只能使用命令行模式 windbg命令行使用以下语法: windbg [ -server Serv ...
- 文件搜索命令find
1.路径加文件名搜索(find): 查找的是etc目录下的以init为名字的文件. 加通配符后为模糊搜索,只要文件名中含有init即可. 查找etc目录下以init开头的七位文件名. 2.搜索时不区分 ...
- s3git 使用git 管理云存储
使用s3git 我们可以方便的基于git协议进行s3存储数据的版本管理,同时也提供了一个方便的golang 包, 我们可以集成到我们的应用中,但是有一点,目前已经没有再更新过了,但是设计理论很不错,实 ...
- ipcm
用来删除一个或更多的消息队ipcm列.信号量集或者共享内存标识
- HTML5 离线应用
一.离线应用cache manifes文件 HTML5中构建了一个离线(无网络状态)应用,只需创建一个cache manifest文件 可以配置需要的缓存的资源,网络无连接应用任然可以使用,本地读取缓 ...
- 金字塔原理(Pyramid Principle)
什么是金字塔原理?简单来说,金字塔原理就是“中心论点---分论点---支撑论据”这样的一个结构. 图片摘自:http://www.woshipm.com/pmd/306704.html 人类通常习惯于 ...
- java如何判断溢出
public int reverse2(int x) { double ans=0; int flag=1; if(x<0){ flag=-1; } x=x*flag; while(x>0 ...
- mysql下sql语句令某字段值等于原值加上一个字符串
MYSQL在一个字段值后面加字符串,如下: member 表名 card 字段名 update member SET card = '00' || card; (postgreSQL 用 || 来连贯 ...