Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.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中跨线程传递事件?_Java_Multithreading_Events - Fatal编程技术网

如何在Java中跨线程传递事件?

如何在Java中跨线程传递事件?,java,multithreading,events,Java,Multithreading,Events,在Java中,如何将事件从子线程传递到主线程,而不将主线程冻结在循环中 在线上,我只能找到解决方案,涉及主线程卡在无限循环中,而在共享线程安全事件FIFO队列中检查事件(孩子将事件放在那里)。 然后睡眠x秒,然后重新开始 我需要主线程处于活动状态并执行其他操作,例如能够处理gui中的事件。当子线程中发生某些事情时,主线程必须调用.eventOccessed()如果确实需要以这种方式使用子线程,则可能需要使用并发队列 如果您使用的是swing,那么可以使用SwingUtilities.invoke

在Java中,如何将事件从子线程传递到主线程,而不将主线程冻结在循环中

在线上,我只能找到解决方案,涉及主线程卡在无限循环中,而在
共享线程安全事件FIFO队列中检查事件(孩子将事件放在那里)。
然后睡眠
x
秒,然后重新开始


我需要主线程处于活动状态并执行其他操作,例如能够处理gui中的事件。当子线程中发生某些事情时,主线程必须调用
.eventOccessed()

如果确实需要以这种方式使用子线程,则可能需要使用并发队列


如果您使用的是swing,那么可以使用SwingUtilities.invokeLater()来执行代码。然后,它将在后台线程中运行它,而不是手动使用子线程。

为了避免冻结UI,应该执行以下操作:

1) 传入工作并发队列,其中工作线程或工作线程池正在签入其运行方法

2) 与UI线程不同的侦听器线程在循环中检查的已完成工作并发队列。侦听器线程使用异步工具/方法调用对UI的更新,以避免UI异常

因此,UI线程向传入的工作队列提供事件或数据。工作线程拿起它,完成工作,并将结果发布到工作完成队列


侦听器线程检查工作完成队列中的新项目,并将结果异步发布到UI。

您需要的是一个侦听器线程,当有事情要做时,它将事件数据传递给主对象。此事件数据将在侦听器线程中处理。否则,您需要主线程进行检查。您使用了多少个用户名?请提供有关线程模型的详细信息。生丝?遗嘱执行人?AWT?摆动主线程是我创建所有gui(Swing)的地方。另一个是原始工作线程,下载内容并对其进行解析。efekctive,感谢您的回答,但是在侦听器线程上,我遇到了同样的问题,我如何将已处理的事件提供给主线程?我想知道,无论将来如何使用和个人理解,但在这种特定情况下,我需要主线程上的事件,以便我可以相应地更新Swing gui。我在几篇文章中读到,如果您将swing组件传递给多个线程和/或尝试从单独的线程更新它们,则会发生不好的事情。然后,有一个队列用于gui发布工作,另一个队列用于发布工作结果。要在UI中显示结果,您需要另一个线程和一些uiCan的异步调用。您可以详细说明一下:在这个方法中,我们需要异步访问AWT调度线程,因为规范规定所有gui代码都需要从该线程运行。所以去那里,我们用猪排。但是,为什么我们可以直接从主线程调用方法呢?它毕竟是主程序的线程,而不是AWT事件调度线程。我错了吗?AsyncInvoke later是另一个“do work”队列,但用于UI主线程。它的内部对我们来说是透明的。UI主线程是我第一次创建gui元素的线程?是的。如果您查看jvm创建的线程,您会注意到这个线程,以及其他线程,如GC、etcI。因此,从我创建第一个gui元素的那一刻起,它就不再是主线程,我基本上处于UI调度线程中