【问题标题】:Why the following lines don't block the EDT?为什么以下行不会阻止 EDT?
【发布时间】: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


【解决方案1】:

假设 Swing GUI 对象是在 event dispatch thread (EDT) 上构建的,那么查询将非常明确地阻塞 EDT 一段时间无限期。如Memory Consistency Properties中所述:

线程中的每个动作发生在线程中的每个动作在程序顺序的后面。

问题不在于在理想条件下时间有多短,而在于出现问题时时间可能会变得多多长。 GUI用户对EDT很敏感livenessworker thread 是防止用户不满的良好保险。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-20
    • 2014-06-25
    • 2011-08-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多