Java 在异步版本中包装同步调用

Java 在异步版本中包装同步调用,java,design-patterns,user-interface,Java,Design Patterns,User Interface,我有一个应用程序,我正试图重新构造以使用MVC架构。GUI启动了几个长时间运行的函数调用,如果我不将它们与GUI线程分离,这些函数调用将阻塞接口 现在我想知道,将具有如此长时间运行函数的控制器对象包装到另一个版本中,只分离对线程池的当前调用是否是一个好主意?这类问题有什么模式吗 编辑 也许我应该提供一个样品。目前,我的代码中充斥着以下内容: env.getScheduledExecutor().execute(new Runnable() { public void run() {

我有一个应用程序,我正试图重新构造以使用MVC架构。GUI启动了几个长时间运行的函数调用,如果我不将它们与GUI线程分离,这些函数调用将阻塞接口

现在我想知道,将具有如此长时间运行函数的控制器对象包装到另一个版本中,只分离对线程池的当前调用是否是一个好主意?这类问题有什么模式吗

编辑 也许我应该提供一个样品。目前,我的代码中充斥着以下内容:

env.getScheduledExecutor().execute(new Runnable() {
  public void run() {
    backend.someLongRunningMethod();
  }
});
现在,我想知道是否应该将
后端
包装成类似于
BackendFacade
的类,该类只需将任何函数调用包装成runnable并将其调度给执行器


值得注意的是,大多数时候,方法返回
void
,或者我根本不在乎。在极少数情况下,我只需要使用
Future
,就可以拿回值。这真的不应该是一个巨大的改变,因为我已经在某一点上解耦了线程,但我想整合一下在整个项目中是如何完成的。

这听起来很像某种异步调用。 通常不同的框架对此有不同的支持

@Async//Servlets/Springs可以。GUI也应该有这样的功能


如果您的框架不允许这样做,那么我看不出让线程池这样做有什么问题。

从同步到异步始终是一个彻底的设计更改,因为不是等待结果,实际上是拉它,现在,后台任务需要将结果推送到适当的位置。最后,这看起来很像任何其他Swing侦听器。您可以发明自己的回调接口,在传递给后台任务的实例中实现该接口。该任务将在该实例上调用“result ready”方法,该方法将调用结果处理代码

还有
SwingWorker
类,但它没有实现线程池。每个实例都将使用一个新线程