2013-11-04 41 views
0

在下面的代碼中,我想在invokeLater完成後執行某些操作。 1)由於調度程序調用setModel,我無法使用invokeAndWait。 2)我不能改變線程內最終變量的值!那我該如何等待involeLater先完成呢?如何檢查invokelater已完成

boolean isDone=false; 
SwingUtilities.invokeLater(new Runnable(){public void run(){ 
    setModel(new DefaultTableModel(oRecordTable, sIP_TABLE_COL_NAMES_LIST)); 
    isDone = true; // CAN NOT BE CHANGED HERE, AS HAS TO BE FINAL 
}}); 
while (!idDone){ 
//wait 
} 
// do something here after the invokeLater is done 
+2

聽起來像一個糟糕的設計問題。你爲什麼使用invokeLater?在ActionListener中執行的代碼已在EDT上調用。您的問題需要更多的澄清,因爲除非您設置某種類型的開關,否則無法確定代碼何時完成。 – camickr

回答

1

你可以使用CountDownLatch來做到這一點。但是這與使用invokeAndWait()完全相同,阻塞當前線程,所以它沒有任何意義。

正確:

SwingUtilities.invokeLater(new Runnable(){public void run(){ 
    setModel(new DefaultTableModel(oRecordTable, sIP_TABLE_COL_NAMES_LIST)); 
    isDone = true; // CAN NOT BE CHANGED HERE, AS HAS TO BE FINAL 

    // do something here after the invokeLater is done <===== 

}}); 

CountDownLatch(沒用,見上文)

final CountDownLatch latch = new CountDownLatch(1); 

SwingUtilities.invokeLater(new Runnable(){public void run(){ 
    setModel(new DefaultTableModel(oRecordTable, sIP_TABLE_COL_NAMES_LIST)); 
    isDone = true; // CAN NOT BE CHANGED HERE, AS HAS TO BE FINAL 

    latch.countDown(); 

}}); 

latch.await(); // could use invokeAndWait as well if blocking thread here ..