【问题标题】:Getting Amazing Exception with Threading In Java Swing在 Java Swing 中使用线程获得惊人的异常
【发布时间】:2012-11-14 21:25:44
【问题描述】:

当我在我的代码中使用多线程时,我得到了以下惊人的异常,但是我不知道它发生在哪里。此外,此异常仅在某些时候发生。

线程“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);
    }

【问题讨论】:

  • 与您的问题无关,但我强烈建议使用执行器而不是直接使用线程。看看java.concurrent.Executors
  • 另请注意,从 GUI 线程中访问 Swing GUI 是合法的 - 但这通常会引发更合格的异常。
  • Thread3.sleep(20); sleep 是一个静态方法,因此应该以静态方式访问它:Thread.sleep(20)!此外,请遵循 Java 命名约定:方法和变量以小写字母开头。
  • @user1547018 实际上,没有。违反单线程访问 Swing 的结果只能导致如前所述的不可预知和不可理解的错误。
  • Concurrency in Swing。不允许在除 EDT 之外的其他线程上更改 Swing 组件。查看堆栈跟踪,您正在错误的线程上修改表数据

标签: java multithreading swing exception event-dispatch-thread


【解决方案1】:

有几件事你想调查:

  1. 如果您从 Get****Data 函数更新 GUI(向 JTable 添加项目是异常所暗示的),您将遇到 EDT 问题(即您在错误中看到的 AWT-EventQueue-0 )。而是使用SwingUtils.InvokeLater()。或者,如果您需要它在 20 毫秒(或 20 毫秒间隔)后运行,请使用 Swing Timer

  2. 您正在调用threadname.start();,然后在下一行调用threadname.sleep(20);。根据APIThread.sleep 导致当前正在运行的线程等待 - 在这种情况下是 EDT(不是线程名)。如果您希望线程名休眠,请将 sleep 放在 runnable 中,如下所示:

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

【讨论】:

  • 呵呵...抱歉复制/粘贴。
  • @NickRippe 这个解决方案在我的情况下不起作用,因为它冻结了我的 GUI,甚至比使用线程之前更糟糕
  • 第二个解决方案也没有用,因为也会导致许多异常
  • @SyedMuhammadMubashir 是的 - 在 EDT 上执行代码会冻结您的 GUI - 在 EDT 上执行的任何代码都会阻止 GUI 更新(导致您所指的冻结)。因此,如果您的 Get 方法长时间运行,您不想在 EDT 上运行它们。这意味着您将使用 SwingUtils.InvokeLater() 来执行更新 JTable 的任何内容(在您的 Get 函数内部)。基本上,您需要结合 1 和 2 来创建您的答案。此外,虽然您可以随意对我的答案投反对票,但如果您愿意,您更有可能得到我的帮助。
猜你喜欢
  • 1970-01-01
  • 2015-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-07
  • 2015-08-31
相关资源
最近更新 更多