【问题标题】:Platform.RunLater(), swingUtilities.InvokeLater(), and Thread(runnable) confusion [closed]Platform.RunLater()、swingUtilities.InvokeLater() 和 Thread(runnable) 混淆 [关闭]
【发布时间】:2014-09-21 04:55:33
【问题描述】:

请有人帮我澄清这些概念来自 c++ 并尝试学习 java 一段时间,当我尝试尝试一些摇摆应用程序时刚刚接触到这些术语(前两个)......

【问题讨论】:

  • 请提出更具体和可回答的问题。否则,您似乎是在要求某人为您编写几个教程。什么让你特别困惑?
  • 另外,你展示的这3条代码语句完全不同,没有重叠,除了它们都与线程有关联。
  • @Hovercraft Full Of Eels 好吧,我正在阅读我想在我的应用程序中使用的 swing 示例源代码,并遇到了我想知道为什么不使用线程的前两个概念?它们有什么不同,我可以互换它们并且没有崩溃我的应用程序的风险
  • 请展示您感兴趣的代码,您遇到了哪两条代码语句?您在上面列出了 3 个。你问他们有什么不同——同样,他们都是相互正交的概念。

标签: java swing concurrency javafx


【解决方案1】:

  • SwingUtilities.invokeLater(Runnable r)

    • 来自SwingUtilities API

      导致 doRun.run() 在 AWT 事件调度线程上异步执行。这将在处理完所有待处理的 AWT 事件后发生。当应用程序线程需要更新 GUI 时,应使用此方法。在以下示例中,invokeLater 调用将 Runnable 对象 doHelloWorld 在事件调度线程上排队,然后打印一条消息。

    • 这会在 Swing 事件线程上对 Runnable 对象进行排队,以便 Runnable 包含的代码(可能是改变 Swing GUI 状态或查询 GUI 状态的代码)在 Swing 事件线程上运行。进行此调用的代码不会等待 Runnable 运行,因此无法保证调用代码与 Runnable 代码的代码完成顺序。
  • new Thread(Runnable r)

    • 来自Thread API

      分配一个新的线程对象。此构造函数与 Thread (null, target, gname) 的效果相同,其中 gname 是新生成的名称。自动生成的名称形式为“Thread-”+n,其中n为整数。

    • 这是一个构造函数调用,它创建一个带有 Runnable 的 Thread 对象,当通过在 Thread 对象上调用 start() 启动该对象时,Runnable 在一个新线程中运行,该线程是调用代码线程的后台。
  • Platform.runLater(Runnable r)

    • 来自Platform API

      在未来某个未指定的时间在 JavaFX 应用程序线程上运行指定的 Runnable。此方法可以从任何线程调用,它将 Runnable 发布到事件队列,然后立即返回给调用者。 Runnables 按照它们发布的顺序执行。传递给 runLater 方法的 runnable 将在传递给后续调用 runLater 的任何 Runnable 之前执行。

    • 所以它表明这就像 Swing 的 SwingUtilities.invokeLater(Runnable r),但它是 JavaFX 风格的。

【讨论】:

  • 这就是我能告诉你的关于你的 2 条代码语句的全部内容。第三个你必须查找,或者等待熟悉 JavaFx 的人(不是我,因为我不是)的不同答案,如果这不能为你解决任何问题,那么这是最好的我鉴于您的问题的局限性,到目前为止可以做到这一点,因为您没有提供有关您的困惑来源的详细信息。
猜你喜欢
  • 2010-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-05
  • 1970-01-01
  • 2013-02-19
  • 2012-08-22
  • 1970-01-01
相关资源
最近更新 更多