Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在JavaSwing中获得惊人的线程异常_Java_Multithreading_Swing_Exception_Event Dispatch Thread - Fatal编程技术网

在JavaSwing中获得惊人的线程异常

在JavaSwing中获得惊人的线程异常,java,multithreading,swing,exception,event-dispatch-thread,Java,Multithreading,Swing,Exception,Event Dispatch Thread,当我在我的代码中使用多线程时,我得到了以下惊人的异常,但是,我不知道它发生在哪里。此外,这种例外情况有时也会发生 线程“AWT-EventQueue-0”中出现异常 java.util.NoSuchElementException:在 java.util.Vector$1.nextElement(Vector.java:348)位于 javax.swing.plaf.basic.BasicTableHeaderUI.getPreferredSize(BasicTableHeaderUI.java

当我在我的代码中使用多线程时,我得到了以下惊人的异常,但是,我不知道它发生在哪里。此外,这种例外情况有时也会发生

线程“AWT-EventQueue-0”中出现异常 java.util.NoSuchElementException:在 java.util.Vector$1.nextElement(Vector.java:348)位于 javax.swing.plaf.basic.BasicTableHeaderUI.getPreferredSize(BasicTableHeaderUI.java: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);
    }

有几件事你想调查一下:

  • 如果从
    Get****Data
    函数更新GUI(异常意味着向JTable添加项目),您将遇到EDT问题(这就是您在错误中看到的
    AWT-EventQueue-0
    )。而是使用。或者,如果需要在20毫秒后(或每隔20毫秒)运行,请使用

  • 您正在调用
    threadname.start()threadname.sleep(20)。根据,
    Thread.sleep
    导致当前正在运行的线程等待,在本例中,这是EDT(不是threadname)。如果希望threadname睡眠,请将睡眠放置在runnable中,如下所示:

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

  • 与您的问题无关,但我强烈建议使用Executer,而不是直接使用线程。查看
    java.concurrent.Executors
    还请注意,从GUI线程内访问Swing GUI是合法的,但这通常会引发一个更合格的异常。
    Thread3.sleep(20)睡眠是一种静态方法,因此应该以静态方式访问它:
    Thread.sleep(20)
    !另外,请遵循Java命名约定:方法和变量以小写字母开头。@user1547018实际上不是。违反对Swing的单线程访问的结果只会导致上述无法预测和无法理解的错误。请参阅。除EDT外,不允许在其他线程上更改Swing组件。查看堆栈跟踪,您正在将表数据修改到错误的线程Hehe。。。很抱歉复制/粘贴。@NickRippe此解决方案在我的情况下不起作用,因为它冻结了我的GUi,甚至比使用Thread之前更糟糕。因此,第二个解决方案没有用处,也会导致许多问题exceptions@SyedMuhammadMubashir是-在EDT上执行代码会冻结GUI-在EDT上执行的任何代码都会阻止GUI更新(导致您所指的冻结)。因此,如果您的
    Get
    方法长期运行,您不希望在EDT上运行它们。这意味着您将使用SwingUtils.InvokeLater()执行任何更新JTable的操作(在
    Get
    函数中).基本上,你需要结合1和2来创建你的答案。此外,虽然你可以自由地否决我的答案,但如果你的回答不错,你更有可能得到我的帮助。