Я пытаюсь использовать SwingWorker для выполнения длительной задачи и обновить JLabel с результатом:
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
new SwingWorker<String, Void>() {
@Override
protected String doInBackground() throws Exception {
return doCalculation();
}
protected void done() {
try {
label.setText(get());
} catch (InterruptedException e) {
System.out.println("thread was interrupted");
} catch (ExecutionException e) {
System.out.println("there was an ExecutionException");
}
}
}.execute();
}
});
Я могу нажимать на кнопку сколько угодно раз, и графический интерфейс будет реагировать до тех пор, пока два потока не будут завершены, и в этот момент графический интерфейс зависнет во время работы потоков. Если я запускаю только один поток за раз, эта проблема по-прежнему возникает.
Я был бы рад, если бы кто-нибудь мог указать, неправильно ли я использую SwingWorker или есть другая проблема, о которой я не знаю. Спасибо за ваше время.
Ian
Редактировать
doCalculation () просто требует много времени:
private String doCalculation() {
for (int i = 0; i < 10000000; i++) {
Math.pow(3.14, i);
}
return threads++ + "";
}