繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM