Как проверить invokelater сделано

В приведенном ниже коде я хочу сделать что-то после того, как invokeLater будет сделано. 1) Я не могу использовать invokeAndWait из-за того, что setModel вызывается диспетчером. 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

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 ..
Другие вопросы по тегам