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
之前进行数据库操作并且它在EDT
上运行。但它不会。程序运行顺利我以前做过类似的事情,导致阻塞EDT
和冻结的程序。我在SO用户的建议下,在一个单独的线程中执行了该代码。为什么这段代码不会阻塞EDT
?
答案 0 :(得分:2)
假设Swing GUI对象是在event dispatch thread(EDT)上构建的,那么查询肯定会阻止某些无限期时间段的EDT。如Memory Consistency Properties中所述:
线程中的每个操作都发生在该线程中稍后在程序顺序中的每个操作之前。
问题不在于短时间在理想条件下的情况,而是 long 时间错误的时间。 GUI用户对EDT liveness非常敏感; worker thread可以很好地保护用户不满意。