从EDT派遣任务到主要任务?

时间:2012-11-03 22:27:59

标签: 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或者其他。

2 个答案:

答案 0 :(得分:5)

  

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

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

答案 1 :(得分:2)

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

实施可以像使用while的{​​{1}}循环一样简单。通过BlockingQueue获取ExecutorService,您可以稍高一些。