【发布时间】:2010-03-11 07:16:16
【问题描述】:
类中有一些同步运行的方法。我希望它们异步运行,第一个想法是包装它,并使用 switch 枚举来决定应该调用哪个函数。但是对于每个调用的方法,我都需要包装类中的一个新方法和一个新的枚举。它看起来像这样:
public class QueuedShow implements InterfaceShowAlert, Runnable {
private Class Action {
String param1;
public static enum ActionEnum{
NEW, CHECK, UPDATE, DELETE, DISPLAY;
}
public ActionEnum todo;
public Action(ActionEnum todo, Object param){
this.todo=todo;
this.param1=param;
}
}
private BlockingQueue<Action> actionList;
public void run(){
while(true){
Action action=actionList.take(); //THIS waits until queue isn't empty
switch(action.todo){
case NEW: //Call original function
....
}
}
}
public void new(String param){
actionList.add(new Action(NEW, param));
}
}
然后我学会了反思,我有了一个新的想法。那就是使用字符串而不是直接方法调用来调用方法。 包装类读取和解析字符串,并使用反射获取类和包含方法。它将参数和方法对象放入一个类中,该类放入一个队列中。现在该类使用 Method.invoke(params) 而不是使用枚举进行切换。但是这样的问题是编译时类型检查丢失了。
当然,所有这些都只适用于无效的方法,但当然我们也可以使用 Future 类来返回值。
现在有没有任何框架已经实现了将同步调用转换为异步调用,或者你知道有什么其他方法可以做到这一点。
【问题讨论】:
标签: java asynchronous methods synchronous