java - 推荐一种更好的Java中将同步方法转为异步的方法

标签 java asynchronous methods 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));
    }
}

然后我学习了反射,我有了一个新的想法。即使用字符串调用方法,而不是直接调用方法。 包装类读取并解析字符串,并使用反射获取类和包含方法。它将参数和方法对象放入一个类中,该类放入队列中。现在该类使用 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/

相关文章:

c++ - 当使用对象在虚拟方法中调用虚拟方法时,应该发生虚拟分派(dispatch)吗?

java - 如果在 Eclipse 中调用 "Open Call Hierarchy"仅返回运行检查的方法,这意味着什么?

swift - 如何在同名的方法/属性变量中调用全局函数?

java - 如何获得任何原始数据类型都不能保存的两个大数之和?

java - 如何访问我只通过字符串名称知道的类的类字段?

java - 事务未激活异常 - EJB 事务状态

java - Sonarqube 4.5.1 在 Gradle 中执行任务 ':sonarRunner' 失败

c# - 如果可以编写我们自己的等待对象,那么为什么异步方法只能返回 Task<T>、Task 和 void?

node.js - 为什么等待不适用于 Node 请求模块?

c# - 在 C# 中使用异步方法进行消息循环