建议在Java中将同步方法转换为异步的更好方法

Tia*_*HUo 3 java methods asynchronous synchronous

在类中有一些同步运行的方法.我希望它们以异步方式运行,第一个想法是包装它,并使用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));
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我学会了反思,我得到了一个新的想法.这是使用字符串而不是直接方法调用来调用方法.包装器类读取和解析字符串,并使用反射获取类和包含方法.它将参数和Method对象放入一个类中,该类被放入队列中.现在该类使用Method.invoke(params)而不是使用枚举来切换.但问题是编译器时间类型检查丢失了.

当然,所有这些只适用于无效的方法,但当然我们也可以使用Future类来返回值.

现在是否已经实现了将同步调用转换为异步调用的任何框架,或者您是否知道执行此操作的任何其他方法.

cle*_*tus 5

这是推荐的方法:

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);
}
Run Code Online (Sandbox Code Playgroud)

有:

ExecutorService exec = Executors.newSingleThreadExecutor();
while (/* more actions need to be done */) {
  exec.submit(action);
}
exec.shutdown();
exec.awaitTermination(Long.MAX_VALUE, TimeUnit.MILLISECONDS);
Run Code Online (Sandbox Code Playgroud)