Java 将任务从EDT分派到main?
我一直在读一些关于并发性的文章(这让我头疼) 我知道您可以使用以下方法设置任务以从主线程在EDT上运行:Java 将任务从EDT分派到main?,java,multithreading,swing,concurrency,event-dispatch-thread,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 mouseP
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 }
Thread mymainthread=Thread.currentThread()//
但是您可以设置一个任务在EDT的主线程上运行吗
我想你对EDT是什么感到困惑。Swing和许多其他框架使用一种称为线程限制的技术。
为了保证线程安全,所有操作都从单个线程执行。Swing中的此线程称为事件调度程序线程。
此线程有一个队列,并在同一线程中按顺序一次执行该队列中的所有任务。这就是为什么您的任务应该简短,以免阻塞UI。
因此,当您使用EDT时,实际上是将任务从线程传递到其队列,EDT最终将执行该任务。
您可以做的是将一个任务放在EDT队列上,该队列生成一个要在单独线程上执行的线程。如果您出于某种原因想使用当前线程作为背景线程,也许可以,但为什么需要呢?最简单的方法就是提交一个runnable作为后台线程的一部分运行,例如池的一部分。您可以创建自己的事件循环来执行线程限制。这将允许您使用单独的单个线程,其行为类似于EDT。小心不要在两个线程之间同时[有效地]共享可变对象
实现可以像一样简单,而循环使用阻塞队列
。通过从java.util.concurrent.Executors.newFixeThreadPool(1)
获取ExecutorService
,您可以稍微提高级别?你能告诉我们更多关于你请求背后的动机吗?我自己,我认为你完全错了。:-)只要不创建数百个后台线程,创建后台线程没有什么错。如果您担心这种情况,那么使用某种类型的线程池。@HovercraftFullOfEels这似乎是我的问题中的常见问题。我在想,如果我正在创建经常相互通信的对象,那么确保它们都在同一个线程上不是更明智吗?Nikki:不,我认为也许最好努力确保以线程安全的方式进行通信。默认情况下,所有鼠标和按键事件都在EDT上调度,但取决于这些事件/听众的目标,“主要”是什么???@mKorbel很抱歉,缺少细节。我更新了我的问题。我指的是启动应用程序的线程。(在创建gui之前)。我想保留它,并将其作为课程的主干,让EDT尽可能少地做一些工作possible@HovercraftFullOfEels:最新答案