Java事件派发线程讲解

2024-04-12

我最近开始学习和探索 Java 中 GUI 编程的基础知识。

编程已经有一段时间了,我只做过后端工作或工作,因此我最接近的用户界面是命令控制台(我知道这很尴尬)。

我正在使用 Swing,据我所知,这意味着我也在使用 AWT。

我的问题是基于这段代码:

java.awt.EventQueue.invokeLater(new Runnable() {
    public void run() {
        new frame.setVisible(true);
    }
} );

我已经研究这个问题有一段时间了,因为我想完全理解这段奇怪的代码,并且多次遇到“事件调度线程”这个术语。如果我错了,请纠正我,但据我了解;它与使用多个线程以及 Java Swing 如何解释这些线程有关。我还收集到上面的代码用于确保所有线程在创建窗口之前都是“安全的”,因此调用Later?

我读过:

“您只能从事件调度线程调用对框架进行操作的方法”

并且只有在某些情况下才能从 main 方法调用对框架进行操作的方法。

有人可以向我解释一下事件调度线程到底是什么吗?

它与多个执行线程有何关系以及从主方法调用这些线程如何不安全?另外为什么我们需要这个invokeLater?

我们不能像创建任何其他对象一样创建窗口吗?

我的研究遇到了一些障碍,因为我没有掌握这些关系和想法。

附带说明的是,我喜欢将我的知识建立在深入理解的基础上,因为我相信这会带来最好的整体结果,从而带来最好的项目。如果我深入了解某些东西是如何工作的,那么您可以有效地使用这些技巧和调整,而不是仅仅将它们重复到代码中,所以请不要害怕给我一些额外深入的解释并拓宽我的知识。

谢谢。


The 事件派发线程 https://docs.oracle.com/javase/tutorial/uiswing/concurrency/dispatch.html是一个由 AWT 管理的特殊线程。基本上,它是一个在无限循环中运行的线程,处理事件。

The java.awt.EventQueue.invokeLater https://docs.oracle.com/en/java/javase/11/docs/api/java.desktop/java/awt/EventQueue.html#invokeLater(java.lang.Runnable) and javax.swing.SwingUtilities.invokeLater https://docs.oracle.com/en/java/javase/11/docs/api/java.desktop/javax/swing/SwingUtilities.html#invokeLater(java.lang.Runnable)方法是提供将在事件队列上运行的代码的一种方式。编写在多线程环境中安全的 UI 框架非常困难,因此 AWT 作者决定只允许在单个特殊线程上发生对 GUI 对象的操作。所有事件处理程序都将在此线程上执行,所有修改 GUI 的代码也应在此线程上运行。

现在,AWT 通常不会检查您是否没有从另一个线程发出 GUI 命令(C# 的 WPF 框架确实这样做),这意味着可以编写大量代码并且对此几乎不可知,并且不会遇到任何问题。但这可能会导致未定义的行为,因此最好的办法是始终确保 GUI 代码在事件调度线程上运行。invokeLater提供了一种机制来做到这一点。

一个典型的例子是您需要运行长时间运行的操作,例如下载文件。因此,您启动一​​个线程来执行此操作,然后在完成后,您使用invokeLater更新用户界面。如果你没有使用过invokeLater相反,您只是直接更新 UI,则可能会出现竞争条件,并且可能会发生未定义的行为。

维基百科有更多信息 http://en.wikipedia.org/wiki/Event_dispatching_thread

另外,如果您好奇为什么 AWT 作者不只是使工具包成为多线程,here https://community.oracle.com/blogs/kgh/2004/10/19/multithreaded-toolkits-failed-dream是一篇好文章。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java事件派发线程讲解 的相关文章

随机推荐

  • 如何以编程方式设置 ga_trackingId 属性?

    我有一个应用程序 但根据用户的选择 它将在谷歌分析中完全独立地进行监控 所以我需要以编程方式为 EasyTracker 设置 ga trackingId 我试过了EasyTracker getTracker setAppId id 没有运气
  • mysqlimport - 在 MS Windows XAMPP 环境中导入 CSV 文件

    我正在尝试从命令行将 CSV 文件导入 mysql 数据库 这稍后将合并到 Windows 批处理文件中 mysqlimport u user puserpw columns ID CID Alerted fields terminated
  • 我需要在 Swift 中 memset 一个 C 结构体吗?

    AFAIK 在 swift 中 调用类 结构的默认初始化程序会将所有内容初始化为0 nil 在 C 中 例如套接字编程 有时会使用 memset 在使用结构之前将所有内容设置为 0 我是否也需要在 swift 中使用 memset 还是我写
  • 为什么使用erts_debug:size/1时atom的内存为零?

    I use erts debug size 1计算erlang VM中atom的内存 但我发现输出为零 谁能解释一下原因 7 gt erts debug size true 0 原因是原子与原子的数据一起保存在原子表中 因此整个节点中只有一
  • 如何从Python中的给定文本创建一组类及其变量和方法

    我想从给定的文本配置创建一组类 其变量和方法 特别是使用 django 模型 例如 我有一个要在 models py 中创建的模型列表 classes users posts commnets vars a b bb vv aa metho
  • Spring MVC 静态资源位于单独的 jar 中

    最近 我的同事问我是否可以将静态资源 css 图像 js 放在单独的 jar 文件中 并从 spring mvc 应用程序访问这些静态资源 我在谷歌上搜索 但没有发现任何有趣的东西 所以我的问题是 可能吗 如果是的话 您能解释一下该由谁来做
  • 复杂的 php mysqli 查询插入数据(如果不存在):获取重复列名“?”

    所以 伙计们 请查看我的示例代码 并帮助我 我找不到解决方案 在我传递 等参数的行上不断出现重复的列名称 我在查询中一起传递了 7 个变量 知道可能是什么问题吗 SQL INSERT INTO wifi ssid password name
  • 键入时更新文本框

    在 Access 中 我有一个包含三个文本框的表单 我正在尝试更新一个名为的文本框tbx组合名称两者的组合 textbox tbx姓氏 人的姓氏 textbox tbx名字 人的名字 我的问题是 我使用什么文本框属性 以便在输入文本时tbx
  • 检查开关参数的正确方法是什么

    检查开关值的正确方法是什么 function testSwitch Param switch swth Write Host Value of swth is swth if swth IsPresent Write host Switch
  • 从证书 x509 中提取公钥

    我正在寻找一种从 JavaScript 中的证书 x509 PEM 格式 中提取公钥的方法 如下所示 openssl x509 in cert cer pubkey noout gt pub txt 您需要能够解析 ASN 1 结构的东西
  • decltype中的成员函数调用

    以下代码 struct A int f int auto g int x gt decltype f x 无法编译并出现错误 error cannot call member function int B f int without obj
  • 如何在手机SD卡或其他位置搜索文件

    我想搜索用户移动设备上具有特定扩展名的文件 我尝试搜索但找不到任何直接的 API 是否有特定的 API 或者是否有实现相同目的的繁琐方法 或者是否有一种机制可以调用 linux 调用 find 或类似的东西 Thanks boolean i
  • 使用 Flask 代理到另一个 Web 服务

    我想将对 Flask 应用程序发出的请求代理到计算机上本地运行的另一个 Web 服务 我宁愿使用 Flask 而不是更高级别的 nginx 实例 这样我们就可以重用应用程序中内置的现有身份验证系统 我们越能保持这种 单点登录 越好 是否有现
  • 我可以改变传递给 setState 函数的状态吗?

    我知道我不应该直接在 React 中改变状态 但是当我使用函数时情况如何 onSocialClick e gt const id e target value this setState prevState props gt prevSta
  • 以编程方式在 WooCommerce 中创建多个优惠券

    我一直在寻找一种向 WooCommerce 批量添加优惠券的方法 它实际上是一个包含 800 个会员号码的列表 可以提供折扣 而优惠券似乎是实现此目的的最佳方式 我找到了一种以编程方式添加单张优惠券的方法 http docs woothem
  • Pycharm的终端不会更改Project Interpreter处Python版本对应的Python版本

    我已经安装了 PyCharm 2016 3 并在 Windows 上安装了两个版本的 Python 3 5 2 和 2 7 9 我想使用这两个版本 因此我在 项目解释器 窗口中对其进行了配置 我选择的是3 5 2版本如下图 之后我打开Pyt
  • 在 Meteor 应用程序中使用 Disqus / reCaptcha

    我正在开发一个使用 Meteor 的应用程序 我正在尝试在我的其中一个表单上使用 reCaptcha 并在我的某些页面上使用 Disqus 评论系统 但问题是 当我运行流星服务器时 这些都没有被渲染 以下是我添加到模板中的示例 Disqus
  • 如何结合 websockets 和 http 来创建一个保持数据最新的 REST API? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我正在考虑使用 websockets 和 http 构建一个 REST API 其中我使用 websockets 告诉客户端新数据可用或直接向客
  • 根据连续值之间的差异将列表拆分为子列表

    我有一个值列表 其中每个值至少有一个 但通常是多个 连续值 且增量为 0 033 l 26 051 26 084 26 117 26 15 26 183 31 146 31 183 34 477 34 51 34 543 我想将此列表拆分为
  • Java事件派发线程讲解

    我最近开始学习和探索 Java 中 GUI 编程的基础知识 编程已经有一段时间了 我只做过后端工作或工作 因此我最接近的用户界面是命令控制台 我知道这很尴尬 我正在使用 Swing 据我所知 这意味着我也在使用 AWT 我的问题是基于这段代