我有一個後臺線程以自上而下的左右方式產生圖像的像素(假設爲java.awt.image.BufferedImage
),我希望Swing gui繪製圖像的可用部分定期向用戶展示進展情況。 據我承諾從很多答案,BufferedImage
是不是線程安全的,所以我想知道是否有可能使用java.util.concurrent.Semaphore
來強制執行同步和內存一致性。後臺線程會在每次像素寫入操作後在信號量上調用release()
,而javax.swing.Timer
將在信號量上調用drainPermits()
,並請求返回的像素數量進行繪製。我想這個方案應該工作,因爲Semaphore
狀態的文檔是:BufferedImage的背景創建和與信號量的同步
調用「釋放」方法之前,操作中的一個線索,例如
release()
發生,之前在成功地「獲取」的方法,如行動acquire()
在另一個線程中。
請告訴我,如果我是正確的。
我不明白爲什麼在這個例子中,一些對'BufferedImage'的訪問是同步的,而另一些則不是。見'Model'類中的'next()'方法和'View'類中的'paintComponent(Graphics)'方法。 – maurizeio
好問題:只在模型線程上調用'next()',而在視圖中調用'getImage()'。 – trashgod
確定next()只在模型線程上調用,但它寫入的像素是從另一個線程同時讀取的。是什麼讓這些寫入可見? – maurizeio