2

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

我了解您可以使用以下方法从主线程设置要在 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 }

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

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

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

4

2 回答 2

5

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

我认为您对 EDT 是什么感到困惑。Swing 和许多其他框架使用一种称为线程限制的技术。
为了保证线程安全,所有动作都从单个线程执行。Swing 中的这个线程称为 Event Dispatcher Thread。该线程有一个队列,并在同一个线程中一次一个顺序地
执行该队列中的所有任务。这就是为什么你的任务应该很短以免阻塞 UI。 因此,当您使用 EDT 时,您实际上是将任务从您的线程传递到其队列,而 EDT 最终将执行它。

您可以做的是在 EDT 队列上放置一个任务,该队列会生成一个要在单独线程上执行的线程。如果您出于某种原因想将当前线程用作后台线程,也许可以,但为什么需要它?最直接的方法是提交一个runnable作为一些后台线程的一部分运行,例如池的一部分

于 2012-11-03T22:35:38.327 回答
2

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

实现可以像while带有BlockingQueue. 您可以通过获取ExecutorServicefrom来稍微提高一点水平java.util.concurrent.Executors.newFixeThreadPool(1)

于 2012-11-04T15:55:42.387 回答