[英]Learning Threads - Running a method only after the other has finished
在执行按钮时,我正在调用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();
}
});
但是第二种方法仍然在第一种方法完成之前开始。
扩展我的评论:好像startPrinterListOperation
启动了异步操作并立即完成,这可以通过成功的join
证明。
如果启动的异步操作不在您的控制范围内,那么您可能可以通过一些回调,轮询等来观察它的完成。然后,您可以在startPrinterListOperation
使用类似以下内容的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");
}
}
我不会打扰线程,这只会使您的程序过于复杂。
您可以编辑startPrinterListOperation()
方法吗?
我会改为添加showAplotPlotterDialog();
到startPrinter
方法的末尾,以及该方法做的最后一件事。
在标题中回答您的一般问题时,您有一个主线程直接调用您的两个方法,以便第二个方法等待第一个方法完成。
我了解在您的特定情况下,第一种方法会运行一段时间,并且您希望用户不必等待。
在构造GUI时,应在单独的线程中调用generatePrinterList()
方法。 这样做是因为GUI用户极有可能打印或绘图,并且在用户使用GUI时打印机列表也不太可能更改。
奇怪的是, generatePrinterList()
线程将在用户必须打印或绘图之前完成很长时间。 但是请确保,线程必须具有一种报告线程已完成的方式。 我使用可以通过公共isCompleted()
方法读取的boolean
isCompleted
。
如果需要, isCompleted()
方法可以具有线程睡眠循环,因此它始终返回true。 在这种情况下,该方法不必返回任何内容。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.