【问题标题】:Dispatch a task from EDT to main?将任务从 EDT 分派到主节点?
【发布时间】:2012-11-03 22:27:59
【问题描述】:

我一直在阅读一些关于并发的文章(这让我很头疼)。

我了解您可以使用以下方法从主线程设置要在 EDT 上运行的任务:

SwingUtilities.invokeLater

但是你可以设置一个任务在 EDT 的主线程上运行吗?

如:

Thread mymainthread=Thread.currentThread();//<referring to the thread that initially kicks off public static void main

public void mousePressed(MouseEvent e){ //queue a task to run on mymainthread }

可以吗?这是个坏主意吗?

另一个与此类似的问题 (here) 谈到了创建一个新线程,但如果我的目标是单线程 (+EDT) 应用程序,继续使用主线程不是更安全、更简单吗? .......或者也许我错了。

编辑:我应该解释的:我想创建可以在主线程上相互通信的对象(在慢循环中运行)所以我不希望它们中的任何一个在不同的线程上实例化,edt或其他。

【问题讨论】:

  • 您为什么要这样做?你能告诉我们更多关于你请求背后的动机吗?我自己,我认为你把这一切都搞错了。 :-) 只要您不创建数百个后台线程,创建后台线程就没有错。如果您担心这种情况,请使用某种线程池。
  • @HovercraftFullOfEels 这似乎是我的问题的一个常见问题。我在想,如果我正在创建经常相互通信的对象,那么确保它们都在同一个线程上创建不是更明智吗?
  • Nikki:不,我认为最好努力确保以线程安全的方式进行通信。
  • 默认情况下,所有鼠标和键事件都在 EDT 上调度,但取决于这些事件/侦听器的目标,什么是“主要”???
  • @mKorbel 抱歉,缺少详细信息。我更新了我的问题。我指的是启动应用程序的线程。 (在创建 gui 之前)。我想保留它并将其用作程序的主干,并让 EDT 尽可能少地做

标签: java multithreading swing concurrency event-dispatch-thread


【解决方案1】:

但是你能设置一个任务在 EDT 的主线程上运行吗?

我认为您对 EDT 是什么感到困惑。 Swing 和许多其他框架使用一种称为线程限制的技术。
为了保证线程安全,所有动作都从单个线程执行。 Swing 中的这个线程称为 Event Dispatcher Thread。
该线程有一个队列,并在同一线程中一次按顺序执行该队列中的所有任务。这就是为什么你的任务应该很短以免阻塞 UI。
因此,当您使用 EDT 时,您实际上是将任务从您的线程传递到其队列,而 EDT 最终会执行它。
您可以做的是在 EDT 队列上放置一个任务,该队列会生成一个要在单独线程上执行的线程。如果您出于某种原因想将当前线程用作后台线程,也许可以,但为什么需要它?最直接的方法是提交一个 runnable 以作为某些后台线程的一部分运行,例如游泳池的一部分

【讨论】:

  • @HovercraftFullOfEels:更新答案
【解决方案2】:

您可以创建自己的事件循环来执行线程限制。这将允许您有一个单独的单线程,其行为类似于 EDT。注意不要在两个线程之间同时[有效地]共享可变对象。

实现可以像带有BlockingQueuewhile 循环一样简单。您可以通过从java.util.concurrent.Executors.newFixeThreadPool(1) 获得ExecutorService 来稍微提高水平。

【讨论】:

    猜你喜欢
    • 2015-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多