我的一個應用程序通過讀取一個數組列表,描繪對象的屏幕:Java的油漆「口吃」 -list併發
簡單的代碼摘要:
@Override
public synchronized void paintComponent(Graphics g) {
for(Object gO:paintList) {
g.drawImage(gO.getObjImage(), gO.getXLoc(), gO.getYLoc(), outer.getTransparent(), null);
}
}
問題是我每次添加更多對象用戶點擊鼠標,所以如果用戶點擊的速度夠快,我可以導致程序繪畫造成口吃,因爲它在寫入時不能讀取(arrayList被同步)。開發人員用來處理這種併發問題的常見做法是什麼?
編輯:這裏是調用重繪代碼:
byte ticks = 0;
while(true) {
currentTime = System.nanoTime();
if(ticks == 25) {
drawPanel.repaint();
ticks = 0;
} else if (ticks%5 == 0) {//if ticks is a multiple of 5 (5,10,15,...)
drawPanel.operations();
ticks++;
} else if(ticks < 25) {
ticks++;
}
try {
/*
Refer to: 'http://stackoverflow.com/questions/1036754/difference-between-wait-and-sleep'
on differences between Thread.sleep() and wait()
*/
wait(1);//old timings: (long)(refreshRate*1000)
} catch (InterruptedException ex) {
Logger.getLogger(DeathWish.class.getName()).log(Level.SEVERE, null, ex);
}
//Debugging
//System.out.println(ticks);
currentTime = System.nanoTime();
*,其中操作()計算在「上漆」對象的屬性的變化,去除了符合一定條件的對象,並增加了新的對象油漆名單。從邏輯上來說,添加和書寫應該是分開的? 如果沒有足夠的信息,我可以發佈operations()方法,但我試圖不發佈大量代碼,因此更易於解釋。
一般來說,我有連續繪製屏幕的單個循環,以及處理任何事件的另一個循環(如單擊以添加對象)。這樣,如果事件處理程序被卡住了,paint循環將繼續運行而不會出現口吃。 – Jon 2014-10-03 17:03:38
我真的懷疑用戶可以點擊的速度超過可以獲得的鎖定。鎖定採集約25ns。用戶點擊大約是50ms。 – 2014-10-03 17:09:14
你有什麼異常嗎? – Dimitri 2014-10-03 17:24:30