我正在重构一些运行多阶段进程的代码。每个步骤都在嵌套的java.awt.EventQueue.invokeLAter
调用中。它看起来有点像这样:
import java.awt.EventQueue;
public class NestedInvokeLater {
/**
* @param args
*/
public static void main(String[] args) {
java.awt.EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
changeTabPanel();
copySomeFiles();
enableNextButton1();
upDateProgressBar(10);
java.awt.EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
readInFiles();
doSomethingToFiles();
upDateProgressBar(15);
java.awt.EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
doSomethingElse();
upDateProgressBar(100);
}
});
}
});
}
});
};
}
我对Java的了解还不够深入,无法理解为什么需要将这些调用嵌套起来,我也不太敢随意更改这些调用。但是我认为我理解了invokeLater调用所做的事情以及每个步骤的作用。如果我的理解有误,请纠正我:
invokeLater被用于添加一些调用到待完成的任务列表中,这些调用会在事件分配线程中执行。Java会处理何时以及如何执行每个调用,确保事件分配线程和GUI在执行“后台”任务时不会锁定。
我认为这种嵌套调用意味着我们应该排队一组任务,其中之一是排队某些内容,这又会排队一些任务......其中之一是排队某些内容。但是只有在前一个任务完成后,第一个内部调用才会被排队。一切都按顺序发生(这符合我对整个过程的理解),但我不明白为什么要使用嵌套请求来排队任务。如果我从头开始编写此代码,我会简单地为每个调用创建函数并依次调用它们。
我承认,由于我只是Java的初学者,可能错过了很重要的一点,这使得嵌套调用很重要。但是没有关于嵌套的文档,代码中也没有注释。
我错过了什么?这段代码有什么意义吗?
invokeLater
不会创建新的线程。在这种情况下,它的功能类似于JavaScript中的setTimeout(fn, 0)
——将要做的下一件事放在队列中,确保在doSomethingElse
开始运行之前进行UI(和进度条百分比)更新。假设soSomething
和doSomethingElse
需要“明显的时间”(例如100毫秒到10秒)。 - user166390