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

时间:2012-08-24 09:26:23

标签: java design-patterns user-interface

我有一个应用程序,我正在尝试重组以使用MVC架构。如果不将它们从GUI线程中分离出来,GUI将启动几个长时间运行的函数调用,这些调用会阻塞接口。

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

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

env.getScheduledExecutor().execute(new Runnable() {
  public void run() {
    backend.someLongRunningMethod();
  }
});

现在我想知道是否应该将Backend包装成类似BackendFacade类的东西,它只会将任何函数调用包装到runnable中并将其安排给执行程序。

值得注意的是,大多数时候这些方法会返回void,或者我也不在乎。在极少数情况下我需要重新获得价值,我只会使用Future。它不应该是一个巨大的变化,因为我已经在某个时候解耦了线程,但我想整合它在整个项目中的完成方式。

2 个答案:

答案 0 :(得分:0)

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

有不同的支持
  

@Async // Servlets / Springs。 GUI也应该具有

如果您的框架不允许这样做,那么我就看不到让线程池执行此操作的问题。

答案 1 :(得分:0)

从同步变为异步总是一个根本性的设计变化,因为现在后台任务需要推送而不是等待结果并实际上进入适当的地方。最后,这看起来很像任何其他Swing Listener。您可以创建自己的回调接口,该接口在传递给后台任务的实例中实现。该任务将在该实例上调用“结果就绪”方法,该方法将调用结果处理代码。

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