0

コードでマルチスレッドを使用しているときに、次の驚くべき例外が発生しますが、それがどこで発生するかわかりません。また、この例外は時々しか発生しません。

スレッド「AWT-EventQueue-0」での例外 java.util.NoSuchElementException: javax.swing.plaf.basic.BasicTableHeaderUI.getPreferredSize(BasicTableHeaderUI.java) の java.util.Vector$1.nextElement(Vector.java:348) でのベクトル列挙:793) javax.swing.JComponent.getPreferredSize(JComponent.java:1660) で

アプリケーションでマルチスレッドに以下のコードを使用しています。

       try {
        Thread Thread4 = new Thread() {
           public void run() {
                GetOrderData(mID, "OrderInfo_Orn");
            }
        };
        Thread4.start();
        Thread4.sleep(20);

        Thread Thread5 = new Thread() {
           public void run() {
                GetOrderData(mID, "OrderInfo_Parts");
            }
        };
        Thread5.start();
        Thread5.sleep(20);
        Thread queryThread = new Thread() {

            public void run() {
                GetMasterData(mID, rowId);
            }
        };
        queryThread.start();
        queryThread.sleep(20);
        Thread Thread2 = new Thread() {
            public void run() {
                GetDetailData(mID, "'RcvPrePolishGoods_Detail'");
            }
        };
        Thread2.start();
        Thread2.sleep(20);

        Thread Thread3 = new Thread() {
            public void run() {
                GetDetailData(mID, "'RcvPrePolishGoods_Parts'");
            }
        };
        Thread3.start();
        Thread3.sleep(20);
      } catch (InterruptedException ex) {
        Logger.getLogger(RcvPrePolishGoods.class.getName()).log(Level.SEVERE, null, ex);
    }
4

1 に答える 1

0

あなたが調べたいことがいくつかあります:

  1. 関数から GUI を更新すると (JTable へのアイテムの追加が例外として示されます)、Get****DataEDT の問題が発生します (これAWT-EventQueue-0がエラーに表示されます)。代わりにSwingUtils.InvokeLater()を使用してください。または、20 ミリ秒後に (または 20 ミリ秒間隔で) 実行する必要がある場合は、スイング タイマーを使用します。

  2. あなたは呼び出しthreadname.start();ており、次の行で を呼び出してthreadname.sleep(20);います。APIによるとThread.sleep、現在実行中のスレッド (この場合は EDT (スレッド名ではない)) を待機させます。スレッド名をスリープさせたい場合は、次のようにランナブル内にスリープを配置します。

    Thread Thread5 = new Thread() {
       public void run() {
            Thread.sleep();
            GetOrderData(mID, "OrderInfo_Parts");
        }
    };
    
于 2012-11-27T15:08:37.157 に答える