只是一個快速的一個 - 我在寫一個世嘉主系統仿真器的過程。設計迄今是,GUI(JFrame的子類等)運行在事件指派線程,經由EventQueue.invokeLater()調用,並在單獨的線程中運行所有的仿真器的功能。根據我的理解,這應該是一個好習慣,因爲EDT應該初始化並更新GUI,而Swing不是線程安全的。事件指派線程畫
這使我一個小問題 - 控制檯在單獨的線程(Z80,VDP,等等)和VDP(當我完成了它)將更新一個BufferedImage運行。只要我將這個BufferedImage標記爲'synchronized',是否可以安全地從EDT訪問它(特別是GUI的繪製方法)?我問這個問題,否則我將不得不將很多VDP邏輯放入paint方法本身,我寧願不這樣做,因爲它會降低GUI的整體速度。
簡單的問題,我知道,但我仍然習慣推的Java2D體面速度動畫。值得一提的是,在邏輯線程中調用repaint()方法之後,邏輯線程將一直處於睡眠狀態,直到下一幀通過喚醒爲止,所以我猜測這種設計不會有性能問題 - 上午我對嗎?
非常感謝, 菲爾·波特
UPDATE我應該用更好的語言 - 的VDP將通過同步setter方法來訪問數據的BufferedImage和EDT將通過同步的getter方法來訪問它。
您應該向我們展示一些代碼,顯示您打算做什麼,因爲「將BufferedImage標記爲synchronized」沒有多大意義。方法或代碼塊可以同步,但不是類型。 – 2011-12-27 23:27:53
對不起,我應該用更正確的語言 - 我的意思是,當VDP更新的BufferedImage,它會通過一個同步的「二傳手」的方法做到這一點,而當JFrame的描繪它 - 它會通過一個同步的「吸氣」這樣做方法。由於在EDT中發生繪畫時邏輯線程會睡着,所以EDT不應該等待對象鎖定,因此我認爲這應該起作用。我不確定的原因在於網上有這麼多東西,說GUI不會從另一個線程更新(雖然這是EDT在這種情況下進行繪畫,所以我認爲我沒事)。 – PhilPotter1987 2011-12-27 23:37:44
爲什麼不使用SwingUtilities.invokeLater()將圖像從後臺線程傳遞到EDT? – 2011-12-27 23:42:07