gpt4 book ai didi

java - 不同事件线程之间的死锁

转载 作者:太空宇宙 更新时间:2023-11-04 13:34:11 25 4
gpt4 key购买 nike

我一直在 Java 中工作,并且理解如果我将一个任务分配给事件线程,它可以使用它所需的任何合适的锁,并且它永远不会与我从事件线程创建的任何其他锁发生冲突。

不幸的是,我的 webstart 程序有三个事件线程,其中两个死锁。

我在主线程组中有 AWT-EventQueue-0它卡在绘制操作中,尝试执行 getRowColor() 操作来为表格单元格准备渲染器。在绘制时,它具有组件树锁。

我有 javawsSecurityThreadGroup 的 AWT-EventQueue-1,它看起来足够无害,看起来它可能不会在挂起时受到干扰,但它确实会挂起对文本组件的 invalidate() 调用(Java 控制台?)

最后,我有 javawsApplicationThreadGroup 的 AWT-EventQueue-2。该特定组件获取写锁以设置表数据(阻止针对行颜色的读取)。然后,这会在焦点单元格的更新上停止,该单元格会向下流动scrollRectToVisible()、validateView()、updateCursor()、findComponentAt(),这需要由AWT-EventQueue-0上正在进行的绘制操作持有的树锁

读锁/写锁是我们的代码,它的存在是为了让程序员更少担心线程。我不准备仅仅因为应用程序决定需要额外的事件线程来并行运行就取消它。

最终,我希望我们的应用程序使用单个 AWT-EventThread。有没有办法让一个事件线程将请求转移到另一个事件线程?或者选择哪个事件线程用于绘画,或者在invokeLater()/invokeAndWait()发生时使用?

我不确定这是否重要,但我们确实在我们的应用程序中使用了 FX。

最佳答案

尝试将写锁保护的关键部分的范围缩小到仅写入内存。

如果您从关键部分推送后续通知来更新 UI(这些通知依赖于写入,但不属于写入的关键部分),并允许它们通过其他控制路径使用读取锁定,那么您的死锁问题应该会得到解决。

另一个选择可能是将写入任务 fork 到后台线程(保持正确的同步;另请参阅 java.util.concurrent.ExecutorService ),然后在写入完成时发送通知,可以在显示线程中异步执行。

关于java - 不同事件线程之间的死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31861900/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com