作者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
1F:推 del680202:看了一下原码之後 的确是这个原因 感激不尽 03/23 17:43
2F:→ H45:那个...多绪同步在 swing 有好用的 SwingUtilities.invoke.... 03/23 19:12
3F:推 del680202:那个我试过 但是达不到我想要的效果.... 03/23 21:06