-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上記のコードは、セットアップ前のDB操作のためにブロックする必要があると思いますが、JList実行さEDTれません。プログラムはスムーズに実行されます。以前に同様のことを行った結果、プログラムがブロックされEDTてフリーズしました。 SOユーザーのアドバイスに従って、別のスレッドでコードを作成します。なぜこのコードはブロックされないのEDTですか?

4

1 に答える 1

2

Swing GUIオブジェクトがイベントディスパッチスレッド(EDT)で構築されていると仮定すると、クエリはEDTを一定期間ブロックしますメモリ整合性プロパティに記載されているように:

スレッド内の各アクションは、プログラムの順序の後半にあるそのスレッド内のすべてのアクションの前に発生します。

問題は、理想的な条件下での時間がどれだけ短いかではなく、物事がうまくいかないときにどれだけ時間がかかるかということです。GUIユーザーはEDTの活性に非常に敏感です。ワーカースレッドは、ユーザーの不満に対する優れた保険です。

于 2013-01-16T14:33:01.780 に答える