2012-09-07 37 views
0

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

你创造的问题,那么你想解决问题:) – mishadoff

+0

听起来像是'startPrinterListOperation'启动一个异步操作瞬间完成,由'join'成功evidented。否则应该没问题(只要低级别的线程操作可以很好)。 – ron

回答

1

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

你能编辑startPrinterListOperation()方法吗?

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

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"); 
    } 
} 
+0

你会如何注册回调到不受控制的异步部分? (假设没有代码..) – Vitaliy

+0

我假设有一些东西。但是,真的很难假设任何你不知道的事情。 – ron

0

回答您的一般问题的称号,你有一个主线程直接调用你的两个方法,让第二种方法等待第一种方法来完成。

据我所知,在你的具体情况,第一种方法运行一段时间,你希望用户不必等待。

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

赔率是在你的用户需要打印或绘制在generatePrinterList()线程将完成长。但是可以肯定的是,线程必须有一种报告线程完成的方式。我使用booleanisCompleted,可以用公开的方法读取。

isCompleted()方法可以有一个线程睡眠循环,如果你想要的,所以它总是返回true。在这种情况下,该方法不需要返回任何东西。