类中有一些同步运行的方法。我希望它们异步运行,第一个想法是包装它,并使用 switch enum 来决定应该调用哪个函数。但是对于调用的每个方法,我都需要包装类中的一个新方法和一个新的枚举。它看起来像这样:
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 类来返回值。
现在是否有任何框架已经实现了将同步调用转换为异步调用,或者您是否知道执行此操作的任何其他方法。
最佳答案
这是推荐的做法:
abstract public class Action<T> implements Runnable {
private final T param;
public Action(T param) {
this.param = param;
}
@Override
public final void run() {
work(param);
}
abstract protected void work(T param);
}
与:
ExecutorService exec = Executors.newSingleThreadExecutor();
while (/* more actions need to be done */) {
exec.submit(action);
}
exec.shutdown();
exec.awaitTermination(Long.MAX_VALUE, TimeUnit.MILLISECONDS);
关于java - 推荐一种更好的Java中将同步方法转为异步的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2423210/