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

Nik*_*kki 2 java concurrency swing multithreading event-dispatch-thread

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

我了解你可以设置一个任务,使用以下命令从主线程在EDT上运行:

SwingUtilities.invokeLater
Run Code Online (Sandbox Code Playgroud)

但你可以设置一个任务在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 }
Run Code Online (Sandbox Code Playgroud)

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

关于SO的另一个问题(这里)谈到创建一个新线程,但如果我的目标是单线程(+ EDT)应用程序,那么继续使用main是不是更安全和更简单?.......或者也许我错了.

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

Cra*_*lus 5

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

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