【发布时间】:2013-01-16 12:48:20
【问题描述】:
public lyridisplay (java.awt.Frame parent, boolean modal) {
super(parent, modal);
initComponents();//to create a JList
/* folowing code inside try preforms DB operations*/
/*It will return array of string s*/
try {
s = insert.select();
} catch (ClassNotFoundException ex) {
Logger.getLogger(lyridisplay.class.getName()).log(Level.SEVERE, null, ex);
} catch (SQLException ex) {
Logger.getLogger(lyridisplay.class.getName()).log(Level.SEVERE, null, ex);
}
//now set the string s to JList
jList1.setModel(new javax.swing.AbstractListModel() {
String[] strings =s;
public int getSize() { return strings.length; }
public Object getElementAt(int i) { return strings[i]; }
});
}
我认为上面的代码应该阻止EDT,因为在设置JList之前的DB操作,它在EDT上运行。但它没有。程序运行顺利。我以前做过类似的事情,导致阻止EDT 和一个冻结的程序。我在一个单独的线程中执行了该代码,正如 SO 用户所建议的那样。为什么这段代码不会阻止 EDT?
【问题讨论】:
-
确实,它应该阻塞EDT,但可能是select语句太快了,无法感觉到UI的任何阻塞状态......
-
@ioan 是 select stmt 所用的时间。并插入 stmt。一样吗?因为我在结果集中有 5-6 行,而上次只有一个插入阻止了我的 EDT
-
为什么要屏蔽?如果
insert.select()足够快,它就不会阻塞。 -
@NikitaBeloglazov 最后一次插入阻塞了 EDT。但是 select 为结果集提供了很多行......所以..?
-
@joeyrohan 对不起,不明白。你能详细说明一下吗?
标签: java multithreading swing jdbc event-dispatch-thread