Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将任务从EDT分派到main?_Java_Multithreading_Swing_Concurrency_Event Dispatch Thread - Fatal编程技术网

Java 将任务从EDT分派到main?

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

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

我知道您可以使用以下方法设置任务以从主线程在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 }
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:最新答案