学习线程 - 仅在另一个完成后运行方法

时间:2012-09-07 16:25:31

标签: java multithreading swt

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

    }
});  

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

3 个答案:

答案 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。在这种情况下,该方法不必返回任何内容。