作者H45 (!H45)
看板java
標題Re: [問題] swing上的問題
時間Mon Mar 23 17:31:20 2009
※ 引述《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