看板 java 關於我們 聯絡資訊
※ 引述《SuM0m0 (Part Time Player)》之銘言: : ※ 發信站: 批踢踢實業坊(ptt.cc) : ◆ From: 140.116.247.13 : 推 del680202:看了一下原碼之後 的確是這個原因 感激不盡 03/23 17:43 : → H45:那個...多緒同步在 swing 有好用的 SwingUtilities.invoke.... 03/23 19:12 : : 藉機請問一下,Swing中為了不讓處理時間過長導致整個視窗停住。 : 所以都會希望寫另一個thread來跑,可是如果是用invokeLater()方法, : 那結果它還是會排到EDT裡面,視窗依舊會停住,直到處理完畢。 : : 不過就我所知一般其實都不會這樣做,而是會利用SwingWorker的 : doInBackground()方法來作到這樣的效果。 : : 一般來說運作很正常也沒什麼問題,可是發現用了SwingWorker.execute()之後, : 一樣會跑出因為多執行序而發生的ArrayIndexOutOfBound的Exception, : (我不確定是不是我有兩個以上的SwingWorker在跑,但我有用一些方法讓 : 其中一個一定會先執行完畢後在讓另一個開始,另外我的狀況是發生在JTable) : 或者是我使用上有什麼疏忽呢? : : 推 del680202:那個我試過 但是達不到我想要的效果.... 03/23 21:06 : : 另原po的狀況應該可以用SwingWorker的 publish() & process()試試看, : 不過會不會有Exception我就不知道了... 應該是不會,應該... 首先 SwingWorker 是 1.6 才有的類別 如果我沒有誤會的話,SwingWorker 採用的是 Future Pattern [1] 在使用時一定要注意執行緒的關係,SwingWorker 提供一系列的方法給設計者覆寫: 1. doInBackground(): 花時間的工作寫在這裡 2. process(), done(): 更新圖形介面或是任何與 Swing 有關的都寫在這裡 使用的時候,只要注意下列方法呼叫即可: 1. execute(): 開始做事 2. get(): 拿取工作結果 請你在重新檢視一次 doInBackground() 內是否有 Swing 相關的工作,使得競速條件 發生而拋出 ArrayIndexOutOfBound 例外。必要的時候,請參考 API DOC, 使用 publish() 來傳遞參數給 process() 方法。 [1] http://caterpillar.onlyfun.net/Gossip/DesignPattern/FuturePattern.htm -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.116.247.13
SuM0m0:我的doInBackground內是資料庫的查詢所以沒辦法用publish 03/23 22:49
SuM0m0:且應該沒有Swing相關工作 單純就產生TableModel done的時候 03/23 22:51
SuM0m0:在setModel而已 ~_~ 03/23 22:52
SuM0m0:查了一下 TableModel似乎也不是thread-safe 或許是這個問題 03/23 23:08
SuM0m0:或許是這個問題吧 再找時間 try , thanks anyway 03/23 23:09
SuM0m0:.....用詞重複了... 60秒的推文真讓人腦羞 囧rz 03/23 23:11