Я пишу Java-приложение с графическим интерфейсом, которое выполняет анализ и анализ XML. Поскольку выполнение некоторых методов заняло некоторое время, я превратил их в задачи (и, таким образом, смог также использовать автоматически сгенерированный код netbeans для обновления индикатора выполнения и области сообщений основного графического интерфейса пользователя). В некоторых частях кода мне нужно знать результаты первой задачи перед выполнением следующей задачи, но Java, по-видимому, запускает их параллельно по умолчанию.
По сути, если бы я запустил приведенный ниже код, я бы получил его для печати «завершенной задачи 1» во время выполнения задачи, а также, вероятно, также оценил бы следующий оператор If как false (даже если бы он был истинным) потому что задание еще не закончено.
Я гуглил и пробовал несколько вещей и, похоже, врезался в стену. Были некоторые сообщения о переопределении метода done () в Task, чего я почему-то не могу сделать, потому что он объявлен как final. Я могу вызвать task.get () в главной форме / EDT, но это также блокирует обновление GUI (делая индикатор выполнения неактуальным).
Некоторые обобщенные фрагменты кода:
Из главного окна (также 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);
}
}
Из классов переводчика / другого переводчика:
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;
}