Java Swing:立即运行代码vs调用器

Java Swing:立即运行代码vs调用器,java,multithreading,swing,event-dispatch-thread,invokelater,Java,Multithreading,Swing,Event Dispatch Thread,Invokelater,我目前正在使用其他人编写的线程控制类。它用于java swing应用程序。我有两种方法,但我不明白为什么我会从这两种方法中得到不同的行为。根据我对事件调度器线程和Swing的了解和阅读,下面两种方法应该没有区别。显然,这不是真的 //If this is the AWT Event Processing thread then run the code immediately, //otherwise schedule it for later processing public stat

我目前正在使用其他人编写的线程控制类。它用于java swing应用程序。我有两种方法,但我不明白为什么我会从这两种方法中得到不同的行为。根据我对事件调度器线程和Swing的了解和阅读,下面两种方法应该没有区别。显然,这不是真的

//If this is the AWT Event Processing thread then run the code immediately, 
//otherwise schedule it for later processing

 public static void runWithEventThread(Runnable r)
{
    if (EventQueue.isDispatchThread())
    {
        r.run();
    }
    else
    {
        EventQueue.invokeLater(r);
    }
}


//Schedule the runnable for later processing by the AWT Event Queue
public static void runLaterWithEventThread(Runnable r)
{
    EventQueue.invokeLater(r);
}
在更新GUI(新按钮/重新绘制)时使用runWithEventThread()显示弹出窗口时,我发现GUI有时会出错。但是,使用runLaterWithEventThread()时,一切正常,没有问题

唯一的问题是,当使用runLaterWithEventThread()时,我发现当我有多个弹出窗口将一个接一个地显示(单击“确定”后),所有弹出窗口都会同时显示


据我所知,这两种方法应该做相同的事情。有人能解释一下发生了什么吗

如果第一个方法是从事件线程执行的,那么它的行为可能与第二个方法不同:如果当前有任何事件等待在事件线程上,那么如果使用第二个方法,这些事件将在执行run()方法之前被处理,但是如果使用第一个方法,您的run()方法将立即执行,队列中的任何现有事件都将在run()方法完成后运行。

Re“GUI有时会搞砸”什么意思?另外,您传递的任务需要多长时间才能运行?我基本上是在更改JList项目的颜色。JList中的混乱部分会被弹出屏幕的扭曲图像覆盖。类似于程序崩溃时,最小化屏幕,但有时会保留程序的扭曲图像。我传递到run的任务首先是更新Jlist,然后是弹出窗口。