作者H45 (!H45)
看板java
标题Re: [问题] swing上的问题
时间Mon Mar 23 22:44:24 2009
※ 引述《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
1F:推 SuM0m0:我的doInBackground内是资料库的查询所以没办法用publish 03/23 22:49
2F:→ SuM0m0:且应该没有Swing相关工作 单纯就产生TableModel done的时候 03/23 22:51
3F:推 SuM0m0:在setModel而已 ~_~ 03/23 22:52
4F:推 SuM0m0:查了一下 TableModel似乎也不是thread-safe 或许是这个问题 03/23 23:08
5F:→ SuM0m0:或许是这个问题吧 再找时间 try , thanks anyway 03/23 23:09
6F:→ SuM0m0:.....用词重复了... 60秒的推文真让人脑羞 囧rz 03/23 23:11