java - 将任务从 EDT 分派(dispatch)到 main?

标签 java multithreading swing concurrency event-dispatch-thread

我一直在阅读一些有关并发的内容(这让我很头疼)。

我知道您可以使用以下方法设置一个任务以在主线程的 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)应用程序,继续使用 main 不是更安全、更简单吗? ......或者也许我把这一切都错了。

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

最佳答案

but can you set a task to run on the main thread from the EDT?

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

关于java - 将任务从 EDT 分派(dispatch)到 main?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13214111/

相关文章:

java - JTree 中的桌面 View - Swing - 仅限 Windows

Java KeyListener 与移动对象

java - 从 Pig 中的 UDF(Java) 返回 Map

java - 如何通过使用Maven导入另一个包类?

android - 我应该在 android 中使用 setDaemon() 吗?

python - 通过 CTRL+C 中断所有线程

java - 如何使用 KeyAdapter 检测 CTRL+SHIFT+ANY_KEY?

java - 使用 Jackson ObjectMapper 的 JSON 反序列化 Joda Money 导致异常

java - 在 OpenGL 中使用 ByteBuffer 作为纹理

python - multiprocessing.Process导致: OSError: [Errno 12] Cannot allocate memory even when I run only 1 process