【发布时间】:2012-01-17 00:06:36
【问题描述】:
我正在编写一个 Java GUI 应用程序,它正在执行一些 XML 解析和分析。由于某些方法需要一些时间才能完成,因此我将它们变成了任务(因此也能够利用 netbeans 自动生成的代码来更新主 GUI 的进度条和消息区域)。在运行下一个任务之前,我需要在代码的某些区域知道第一个任务的结果,但 Java 似乎默认并行运行它们。
基本上,如果我运行下面的代码,我会让它在任务运行时打印“完成的任务 1”,而且它也可能将下一个 If 语句评估为假(即使它是真的)因为任务还没有完成。
我一直在谷歌上搜索并尝试了一些东西,但似乎碰壁了。有一些关于覆盖 Task 的 done() 方法的帖子,由于某种原因我不能这样做,因为它被声明为 final。我可以在主窗体/EDT 上调用 task.get(),但这也会阻止更新 GUI(使进度条无关紧要)。
一些通用代码sn-ps:
从主窗口(也是 EDT)
@Action
private void someAction(java.awt.event.ActionEvent evt) {
ApplicationContext C = getApplication().getContext();
TaskMonitor M = C.getTaskMonitor();
TaskService S = C.getTaskService();
Task task = interpreter.parse();
S.execute(task);
M.setForegroundTask(task);
System.out.println("finished task 1");
if (interpreter.someBool() == true) {
task = anotherInterpreter.parse();
S.execute(task);
M.setForegroundTask(task);
}
}
来自解释器/anotherInterpreter 类:
public Task parse() {
Task task = new Task( org.jdesktop.application.Application.getInstance() ) {
@Override
protected Void doInBackground() {
// parse the file
// set someBool to true if the another interpreter needs to be run
return null;
}
};
return task;
}
【问题讨论】:
标签: java background task synchronous swingworker