java - 为什么 Swing 组件应该只在事件调度线程上访问?

标签 java multithreading swing concurrency event-dispatch-thread

<分区>

SwingWorker javadoc 中提到了上述语句。

在一个应用程序中,我看到一个冗长的后台任务在一个不同的线程中运行并且更新 UI 也没有问题(对 Swing 组件的引用是可访问的)。

莫非是有什么不好的事情要发生了?

最佳答案

这是因为 Java memory model不保证一个线程的内存写入对其他线程可见,除非您使用某种形式的同步。为了性能和简单性,Swing 不是同步的。因此,EDT 可能永远看不到来自其他线程的写入。

您看到的应用程序可能大部分时间都可以工作,甚至可能在某些环境中一直工作。但是当它不起作用时,它会以难以重现的非常奇怪的方式失败。

关于java - 为什么 Swing 组件应该只在事件调度线程上访问?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28736854/

相关文章:

java - 使用 setValueAt 更改数据后无法更新 JTable 的值

java - 从 JTable 的另一个类传递 LinkedList。自动更新表

java - 即使使用 SwingWorker,jLabel 的 setText 也无法工作

java - Android 文件系统上的目录和文件创建

c# - SQL Server死锁由索引中的范围锁引起

c# - 另一个锁定问题

c - 创建和销毁线程时内存泄漏

java - 在数据集上运行 "aggregate"函数时出现代数错误

java - 如何以并行方式运行 apache nutch 不同的作业

java - java中time_wait连接增加的原因是什么?