在我的按钮执行中,我正在调用2个方法。
plotButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
startPrinterListOperation();
showAplotPlotterDialog();
}
});
startPrinterListOperation();
需要一些时间才能完成任务。但我不希望方法showAplotPlotterDialog();
在第一个完成之前运行。所以我试图使用线程管理来实现这一目标。这是我尝试过的。
plotButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
Thread t = new Thread() {
public void run() {
startPrinterListOperation();
}
};
t.start();
try {
t.join();
}
catch (InterruptedException e1) {
e1.printStackTrace();
}
showAplotPlotterDialog();
}
});
但第二种方法仍然在第一种方法完成之前开始。
答案 0 :(得分:2)
扩展我的评论:似乎startPrinterListOperation
启动异步操作并立即完成,由join
成功证明。
如果启动的异步操作不受您的控制,那么您可以通过一些回调,轮询等方式观察它。然后您可以在startPrinterListOperation
中使用以下内容:
void startPrinterListOperation() {
final CountDownLatch c1 = new CountDownLatch(1);
launchTheAsyncOp(new SomeCallback() {
void x() {
c1.countDown();
}
});
try {
c1.await(999, TimeUnit.SECONDS)
}
catch (InterruptedException e) {
throw new MyRuntimeException("user didn't finish the op in 999 seconds, fail");
}
}
答案 1 :(得分:1)
我不打扰线程,这只会让你的程序过于复杂。
可以编辑startPrinterListOperation()
方法吗?
我会将showAplotPlotterDialog();
添加到startPrinter
方法的末尾,以及该方法的最后一件事。
答案 2 :(得分:0)
在标题中回答你的一般问题,你有一个直接调用你的两个方法的主线程,所以第二个方法等待第一个方法完成。
我理解,在您的具体情况下,第一种方法会运行一段时间,您希望用户不必等待。
在构建GUI时,应该在单独的线程中调用generatePrinterList()
方法。这样做是因为您的GUI用户很可能打印或绘图,并且在用户使用GUI时打印机列表不太可能发生变化。
可能的情况是generatePrinterList()
线程将在用户打印或绘图之前很久完成。但只是为了确定,线程必须有一种报告线程完成的方法。我使用了boolean
isCompleted
,可以使用公共isCompleted()
方法阅读。
如果需要,isCompleted()
方法可以有一个线程休眠循环,因此它总是返回true。在这种情况下,该方法不必返回任何内容。