0

在下面的代码中,我想在 invokeLater 完成后做一些事情。1)由于调度程序调用了setModel,我无法使用invokeAndWait。2)我不能改变线程内最终变量的值!那么我该如何等待 involeLater 先完成呢?

 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
4

1 回答 1

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 ..
于 2013-11-04T18:24:06.940 回答