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