单个线程环境中单个事件源的Java Swing多事件侦听器

时间:2011-01-21 15:01:19

标签: java multithreading swing

我目前正在学习Swing,而且我是GUI开发的新手。在我的测试应用程序中,我有一个单个事件源的多个事件列表器,我想知道这些事件监听器中的哪一个将首先被激活。

另外,我很想知道Swing事件处理在单线程环境中是如何工作的,特别是当你有一个单个事件源的多个监听器时。

最后,我想知道一些常见的情况,我必须在Swing中使用多个线程。

谢谢!

1 个答案:

答案 0 :(得分:12)

我会尝试回答你的所有3个问题。首先,没有指定ActionListener s fire的顺序。人们不应该假设他们会触发特定的命令。如果您需要按特定顺序执行操作,请将它们放在相同的ActionListener

编写Swing时,您“几乎”总是处于多线程环境中。有一个称为事件调度线程(EDT)的线程。这是处理所有事件的线程。您执行的任何其他处理都应该在不同的线程上完成,否则您的Swing GUI可能会无响应。

Swing中多线程的常见情况是,您需要进行一些需要较长时间的处理。 (强烈的计算,IO,数据库连接)您将希望在与EDT的单独线程上进行艰苦的工作。这将使您的GUI保持响应。

Oracle网络在Swing中提供了一个很好的并发教程。我建议你check it out

  

Swing程序员处理以下类型的线程:

     
      
  • 初始线程,执行初始应用程序代码的线程。
  •   
  • 事件调度线程,其中执行所有事件处理代码。大多数与Swing框架交互的代码也必须在此线程上执行。
  •   
  • 工作线程,也称为后台线程,执行耗时的后台任务。
  •   

Swing中任何多线程问题的规范答案是使用SwingWorker。它允许您在与EDT的单独线程上轻松协调后台工作。像往常一样,Oracle有一个great tutorial on how to use SwingWorker