我有一个后台线程,以自上而下的左右方式生成图像的像素(假设java.awt.image.BufferedImage
),我希望Swing gui定期绘制图像的可用部分,向用户显示进度。
据我提出的许多答案,BufferedImage
不是线程安全的,所以我想知道是否可以使用java.util.concurrent.Semaphore
来强制实现同步和内存一致性。在每个像素写操作之后,后台线程将在信号量上调用release()
,而javax.swing.Timer
将在信号量上调用drainPermits()
并请求返回的像素数被绘制。我想这个方案应该有效,因为Semaphore
的文档说明:
在调用“发布”方法之前的一个线程中的操作,例如
release()
发生在之后的行为发生在另一个线程中成功的“获取”方法(例如acquire()
之后
请告诉我我是否正确。
答案 0 :(得分:1)
作为java.util.concurrent.Semaphore
的替代方案,请考虑在模型中使用javax.swing.Timer
定期通知观察视图,并同步访问不断发展的BufferedImage
。如果您的模型为Observable
,则可以使用arg
中的可选notifyObservers()
来传递边界信息。检查完整的示例here。