2012-09-07 51 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。在這種情況下,該方法不需要返回任何東西。