看板 java 關於我們 聯絡資訊
※ 引述《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
del680202:看了一下原碼之後 的確是這個原因 感激不盡 03/23 17:43
H45:那個...多緒同步在 swing 有好用的 SwingUtilities.invoke.... 03/23 19:12
del680202:那個我試過 但是達不到我想要的效果.... 03/23 21:06