很確定所有這些方法都能正常工作,但我會很欣賞哪種方法是最好的。使用invokeLater
考慮到參數的緣故,你有UI更改代碼和合理密集(平均500毫秒)邏輯代碼混合的(不幸的)場景,並且不可分離。所有不斷變化的UI組件都在一個面板上。
01 new Thread(){
02 public void run(){
03
04 for (int i = 0; i < 100; i++){
05 // some processing
06 doSomething();
07 // update some ui components
08 panel.doSomeUi();
09 }
10
11 panel.revalidate();
12 panel.repaint();
13
14 }}.start();
您會選擇以下3種方法中的哪一種,爲什麼?
- 包裹在invokeLater的所有代碼 內doSomeUi(
- 調用invokeLater的),然後再次重新驗證/重繪
- 只使用了invokeLater進行重新驗證/在結束
重繪對於礦:
選項1將掛起事件處理線程(EPT),同時發生所有處理
選項2在開銷時會考慮許多新的可運行參數,並且在特殊情況下可能會導致ui在半完成狀態下更新,如果組件需要某些後續ui更改纔會生效
選項3將是最高效但可能有一些線程安全問題
熱衷於聽取其他意見。
我會接受這個答案,除非有人進一步深入... – pstanton 2009-10-23 01:47:13