-1
    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 users 的建议,在单独的线程中编写代码。为什么这段代码不会阻塞EDT

4

1 回答 1

2

假设 Swing GUI 对象是在事件调度线程(EDT) 上构建的,那么查询肯定会在某个不确定的时间段内阻塞 EDT。如内存一致性属性中所述:

线程中的每个动作都发生在该线程中的每个动作之前,这些动作按程序的顺序出现在后面。

问题不在于理想条件下的时间有多,而在于出现问题时时间可能会变得多长。GUI 用户对 EDT活跃度非常敏感;工作线程是防止用户不满的良好保险。

于 2013-01-16T14:33:01.780 回答