我有一个应用程序,我正在尝试重组它以使用MVC架构。GUI启动了几个长时间运行的函数调用,如果我不将它们从GUI线程中分离出来,这些函数调用就会阻塞接口。
现在我想知道,将具有长时间运行函数的控制器的对象包装到另一个版本中,只将当前调用分离到线程池是否是个好主意?这类问题有什么规律吗?
编辑也许我应该提供一个样品。目前,我的代码中充斥着以下内容:
env.getScheduledExecutor().execute(new Runnable() {
public void run() {
backend.someLongRunningMethod();
}
});
现在我想知道是否应该将Backend
封装到类似BackendFacade
类的东西中,该类只将任何函数调用封装到可运行的中,并将其调度到执行器。
值得注意的是,大多数情况下,方法都会返回void
,否则我根本不在乎。在极少数情况下,我需要取回值,我只使用Future
。这不应该是一个巨大的变化,因为我已经在某个时候解耦了线程,但我想在整个项目中巩固它的实现方式。
这听起来很像某种异步调用。通常不同的框架对此有不同的支持
@异步//Servlet/Springs可以。GUI应该也有
如果您的框架不允许这样做,那么让线程池这样做不会有任何问题。
从同步到异步总是一个根本性的设计更改,因为现在后台任务需要将结果推送到适当的位置,而不是等待结果并实际上拉。最后,这看起来很像任何其他Swing Listener。您可以发明自己的回调接口,在传递给后台任务的实例中实现该接口。该任务将调用该实例上的"result-ready"方法,该方法将调用结果处理代码。
还有SwingWorker
类,但它没有实现线程池。每个实例都将使用一个新线程。