2011-10-17 34 views
1

SwingWorker可以讓你在後臺準備一些數據Thread然後在EDT中使用它。我正在尋找一個相反的工具:在EDT中準備數據,然後將其傳遞到背景ThreadJava是否有內置的「反轉」SwingWorker

如果您好奇,該用例將JTable的狀態保存到磁盤(列順序,大小等)。我需要在EDT中與其模型交談,但不想從此線程寫入磁盤。

喜歡的東西:

void saveCurrentState(final Table table) { 
    SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      TableColumns state = dumpState(table); 
      saveToDisk(table.getTableKey(), state); 
     } 
    }); 
} 

dumpState()需要在美國東部時間運行。不應該在EDT中運行saveToDisk()。整個事情是故意包裝在invokeLater(),我不能用invokeAndWait()代替它。

+2

那個其他線程在做什麼?如果它是一個新的線程,只需要給它的數據... –

回答

2

您可能正在尋找ExecutorService。使用Executors.newCachedThreadPool()或其他newXXX()方法獲得一個,但是對於大多數用途應該是可以的。

這就是說,我相信這是你可以用SwingWorker做的事情。只需在事件處理程序中準備好您的數據,然後即可創建SwingWorker - 您已在美國東部時間。如果您需要從非EDT線程啓動此操作,請使用SwingUtilities.invokeAndWait()準備數據,然後關閉另一個線程來完成寫入操作(或者在開始使用的同一個非EDT線程中執行此操作。)

SwingWorkerExecutorService提供了相同的基本服務 - 將一些工作分解爲後臺線程,而無需明確管理其生命週期。 SwingWorker有一個方便的方法與EDT進行通信,而不需要使用invokeLater(),而ExecutorService支持期貨作爲與異步任務通信的更一般的(非Swing特定的)方式。因爲你們兩個都沒問題,所以這是一個不容忽視的用例。

+0

謝謝,這是我最後的目的。現在,如果只有Java關閉...... :-) –

+0

按照JSR正在進行的速度,Java應該不遲於2020年關閉! – millimoose