1

在我的按钮执行中,我调用了 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();

    }
});  

但是第二种方法仍然在第一种方法完成之前开始。

4

3 回答 3

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");
    }
}
于 2012-09-07T16:40:59.417 回答
1

我不会打扰线程,这只会使您的程序过于复杂。

你可以编辑startPrinterListOperation()方法吗?

相反,我会添加showAplotPlotterDialog();到方法的末尾startPrinter,以及该方法所做的最后一件事。

于 2012-09-07T16:50:51.033 回答
0

在标题中回答您的一般问题,您有一个主线程直接调用您的两个方法,以便第二个方法等待第一个方法完成。

我了解在您的具体情况下,第一种方法会运行一段时间,您希望用户不必等待。

generatePrinterList()在构建 GUI 时,您应该在单独的线程中调用方法。您这样做是因为您的 GUI 用户很可能会打印或绘图,并且当用户使用您的 GUI 时打印机列表不太可能更改。

奇怪的是,generatePrinterList()线程将在您的用户必须打印或绘图之前很久就完成。但是为了确定,线程必须有一种方法来报告线程已完成。我使用一个boolean isCompleted可以用公共isCompleted()方法读取的。

isCompleted()如果你愿意,该方法可以有一个线程睡眠循环,所以它总是返回 true。在这种情况下,该方法不必返回任何内容。

于 2012-09-07T17:10:09.233 回答