하나는 배열 목록을 읽어 화면에 개체를 페인트 :자바 페인트 '망가'-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() 메소드를 게시 할 수 있지만 해석하기 쉽도록 코드의 거대한 부분을 게시하지 않으려 고합니다.
일반적으로 화면을 연속적으로 칠하는 단일 루프가 있으며 개체를 추가하기 위해 클릭하는 것과 같은 이벤트를 처리하는 다른 루프가 있습니다. 그런 식으로 이벤트 핸들러가 무언가에 달라 붙으면 페인트 루프가 끊김없이 계속 실행됩니다. – Jon
나는 사용자가 잠금 장치를 얻을 수있는 것보다 더 빨리 클릭 할 수 있는지 의심 스럽다. 잠금 획득은 약 25ns입니다. 사용자 클릭 수는 약 50ms입니다. –
예외가 있습니까? – Dimitri