2013-10-25 40 views
1

我有一個後臺線程以自上而下的左右方式產生圖像的像素(假設爲java.awt.image.BufferedImage),我希望Swing gui繪製圖像的可用部分定期向用戶展示進展情況。 據我承諾從很多答案,BufferedImage是不是線程安全的,所以我想知道是否有可能使用java.util.concurrent.Semaphore來強制執行同步和內存一致性。後臺線程會在每次像素寫入操作後在信號量上調用release(),而javax.swing.Timer將在信號量上調用drainPermits(),並請求返回的像素數量進行繪製。我想這個方案應該工作,因爲Semaphore狀態的文檔是:BufferedImage的背景創建和與信號量的同步

調用「釋放」方法之前,操作中的一個線索,例如release()發生,之前在成功地「獲取」的方法,如行動acquire()在另一個線程中。

請告訴我,如果我是正確的。

回答

1

作爲java.util.concurrent.Semaphore的替代方案,請考慮在模型中使用javax.swing.Timer以定期通知觀察視圖,並同步訪問不斷髮展的BufferedImage。如果您的型號爲Observable,則可以使用notifyObservers()中的可選arg來傳遞邊界信息。一個完整的例子被檢查here

+0

我不明白爲什麼在這個例子中,一些對'BufferedImage'的訪問是同步的,而另一些則不是。見'Model'類中的'next()'方法和'View'類中的'paintComponent(Graphics)'方法。 – maurizeio

+0

好問題:只在模型線程上調用'next()',而在視圖中調用'getImage()'。 – trashgod

+0

確定next()只在模型線程上調用,但它寫入的像素是從另一個線程同時讀取的。是什麼讓這些寫入可見? – maurizeio