Re: [問題] swing上的問題

看板java作者 (!H45)時間16年前 (2009/03/23 17:31), 編輯推噓2(201)
留言3則, 2人參與, 最新討論串2/4 (看更多)
※ 引述《del680202 (DAINA)》之銘言: : 今天我寫了一隻程式 : 希望自動去分析一串文字,然後把找到的文字放到JList顯示出來 : 單執行緒跑的時候沒問題 : 但是多執行緒就會怪怪的 : jButton1.addActionListener(new ActionListener(){ : public void actionPerformed(ActionEvent e) { : parser(jTextField1.getText()); : } : }); : 如果我把parser用另外一個執行緒去跑 : 就會出現 : Exception : in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 630 : at javax.swing.plaf.basic.BasicListUI.updateLayoutState(Unknown Source) : at javax.swing.plaf.basic.BasicListUI.maybeUpdateLayoutState(Unknown Source) : at javax.swing.plaf.basic.BasicListUI.getPreferredSize(Unknown Source) : at javax.swing.JComponent.getPreferredSize(Unknown Source) : ... 根據放大絕直接偷看 OpenJDK 原始碼的結果 以單緒而言,不可能會拋出 java.lang.ArrayIndexOutOfBoundsException 唯一的可能是發生競速條件 (race condition) 也就是你的多緒沒有做同步化,使得多個執行緒同時運作於 updateLayoutState() 而 cellHeights 成員變數 (protected int[]) 在不同的執行緒中做兩次以上陣列初始化 cellHeights = new int[list.getModel().getSize()]; 造成下面的陣列存取產生陣列索引值超出邊界例外 cellHeights[index] = cellSize.height; 由你附上的程式碼無法診斷真正出錯的原因,所以以上猜測仍不一定正確。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.116.247.13

03/23 17:43, , 1F
看了一下原碼之後 的確是這個原因 感激不盡
03/23 17:43, 1F

03/23 19:12, , 2F
那個...多緒同步在 swing 有好用的 SwingUtilities.invoke....
03/23 19:12, 2F

03/23 21:06, , 3F
那個我試過 但是達不到我想要的效果....
03/23 21:06, 3F
文章代碼(AID): #19nrRf7w (java)
文章代碼(AID): #19nrRf7w (java)