Если ваш GUI зависает, то ваша длинная задача (doStuff), вероятно, выполняется в потоке диспетчеризации событий. В то время как он захватывает этот поток, другие действия не могут его использовать.
Если вы пытаетесь запустить задачу несколько раз, вам лучше воспользоваться классом TimerTask
public class Downloader extends TimerTask {
public void run() {
doStuff();
}
}
... elsewhere ...
Timer myTimer = new Timer();
public void gogogo() {
myTimer.scheduleAtFixedRate(new Downloader(), 0, 500);
}
Это немного отличается тем, что ваша задача будет выполняться каждые 500 мс, а не с задержкой в 500 мс. Когда вы закончите, просто используйте myTimer.cancel (), чтобы остановить повторяющееся выполнение задачи.