当前位置: 首页 > 面试题库 >

人们为什么在事件队列上运行Java GUI

阎智
2023-03-14
问题内容

在Java中,要创建并显示一个new JFrame,我只需执行以下操作:

public static void main(String[] args) {
   new MyCustomFrameClass().setVisible(true);
}

但是,我已经看到很多人这样做:

public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            new MyCustomFrameClass().setVisible(true);
       }
    });
}

为什么?有什么好处吗?


问题答案:

在Java的生命周期中,用于控制需要在EDT上执行什么操作的规则(我看到的是“
EDT”比“事件队列”更常用)。而且每次“规则”更改时,Sun建议在EDT上进行越来越多的“ GUI相关”工作。

人们为什么在EDT上运行Java GUI?

  • 因为官方指南建议这样做。

  • 因为这样做将有助于避免许多与GUI相关的线程错误。

请注意,这不是很众所周知,因为Swing本身有一些错误,所以EDT实际上 确实 偶尔
崩溃。每个不平凡的Swing应用程序都使用具有错误的Swing API,因此EDT有时会失效。

您永远不会看到它,这也不是引起关注的原因,因为当EDT死后,它会自动重启。

基本上,在EDT上进行所有与GUI相关的工作,并在EDT之外进行所有冗长的操作(以免阻塞EDT)。

*您要求 *EDIT编辑
一个示例,以了解如何在EDT外部进行冗长的操作。有几种方法可以做到这一点。在最简单的情况下,您只需从EDT创建并启动新线程。这是一个示例:当用户单击按钮时,将调用侦听器回调,我们知道这将在EDT上发生…

    JButton jb = ...
    jb.addActionListener( new ActionListener() {
        public void actionPerformed( final ActionEvent e ) {
          final Thread t = new Thread( new Runnable() {
           public void run() {
             // this shall get executed, after start() has been called, outside the EDT    
             }
           });
           t.start();
        }
    } );

对于更复杂的示例,您想阅读 SwingWorker 等。



 类似资料:
  • 问题内容: 机器人是AWT库的一部分,但它似乎与该库的所有其他部分大不相同。我正在创建一个Swing GUI,它将Swing与Java Native Access(JNA)和Robot混合在一起,以允许Java驱动某些MS Windows / Citrix工作程序。我的直觉是,由于机器人会将事件排队在“平台的本机输入队列”上,所以我最后要做的就是在EDT上运行它,但是另一方面,AWT和Swing库

  • 问题内容: 我认为您听说过消息/事件总线,它是系统中所有事件都在流动的唯一场所。在计算机的主板和LAN网络中可以找到类似的体系结构。对于主板和网络而言,这是一种很好的方法,因为它可以减少导线数量,但是对软件开发有好处吗?我们没有电子产品那样的限制。 消息总线/事件总线的最简单实现如下: 发布事件是通过bus.fireEvent(event)完成的,接收消息是通过bus.addListener(li

  • 我正在使用parallelStream并行上传一些文件,有些是大文件,有些是小文件。我注意到并不是所有的工人都被使用。 一开始一切都运行良好,所有线程都被使用(我将并行选项设置为16)。然后在某一点上(一旦它到达更大的文件),它只使用一个线程 简化代码: uploaderPool是一个ArrayBlockingQueue。日志: 似乎所有的工作(列表中的项目)都分布在16个线程中,委托给一个线程的

  • 问题内容: 它是通过以下方式创建的: 一段时间后,我发现: 因此,我发现该事件根本没有运行。 问题答案: 您的事件调度程序正在运行吗?用检查。 如果您没有用户“ event_scheduler”的进程“ Daemon”,则该进程未运行。 因此,启动事件调度程序: 另请参见http://dev.mysql.com/doc/refman/5.1/zh-CN/events- configuration.

  • 你为什么要这么做?我理解增加消息的持久性(如果一个节点关闭,其他队列仍然获得消息)。但是性能呢?集群如何提高性能。难道所有的消费者/生产者都不会连接到主节点的队列吗?如果是这样,我们不是仍然在单个节点上获得流量吗?我们是否设置了负载均衡器,使得流量每次都指向不同的节点? RabbitMQ集群如何提高性能?

  • 我的一位同事最近在eclipse中创建了一个新项目,并使用内置的git客户端提交和推送。在我克隆到计算机并用eclipse打开后,我发现eclipse正在创建.classpath文件。CLASSPATH不是eclipse项目(也是.project)查找引用的JAR的关键文件吗?我在谷歌后非常困惑,看到所有的讨论都在谈论忽略他们。难道它们不是Eclipse正确工作的关键吗?为什么人们忽视了他们?如果