我的背景主要是在JavaScript中,其中函数是一流的对象,我可以轻松地将它们作为回调传递给它们。这就是JavaScript的方式。
现在我正在尝试构建一个简单的Java应用程序。手头的问题是(1)使用Swing让用户浏览到要打开的文件,然后(2)用它做一些事情。让我们说我有这样的方法
void doStuff(File file) {
//stuff
}
需要在用户选择的文件上运行。在JavaScript中,doStuff函数只是作为回调传递。如何用Java做到这一点?
我意识到可以通过使用void run()方法创建一个Callback接口来在Java中进行回调。但这是惯用的吗?如何应该这样做?经验丰富的Java程序员如何选择这样做?
另外,当我使用回调时,看起来几乎所有事情都发生在Event Dispatch Thread上。我想我可以从EDT创建一个新的第三个线程,但似乎我的doStuff函数应该在主线程上执行。我无法找到实现这一目标的任何方法。我也不知道实现它是否必要或可取。
答案 0 :(得分:1)
简单地说,"做东西"将从文件中解析和导入数据。
由于这涉及文件或资源输入,因此不应在EDT上完成。 IMO的最佳解决方案是
doInBackground()
方法中进行导入和解析get()
,这样您就可以获得希望它生成的任何结束值,这样您就可以捕获并响应任何和所有异常可能在其运行期间发生过。有关详情,请查看教程 - Lesson: Concurrency in Swing
您是否建议主要使用SwingWorker,以便此过程不会在EDT上进行,从而锁定用户界面?
是。任何线程都可以达到这个目的,但使用SwingWorker的主要优点是因为虽然它将在后台线程中运行该进程,但它也有很好的机制来提供结束和中间结果 on EDT ,以及监控进度的内置功能。