Loading...

JAVA / / 2022. 2. 9. 12:31

자바 52강. 이벤트 루프

반응형

버블 게임의 내부 구조를 보자.

 

main 스레드는 캐릭터를 띄워놓고

키보드의 입력이 들어올 때까지 놀고 있다.

 

키보드의 입력을 지켜보고 있던

OS의 리스너 스레드가

입력을 캐치하면

 

main 스레드에게 keyPressed 메서드

이벤트 처리해준다.

 

OS가 콜백 해주는 것이다.

 

실제로는 Player의 right( ) 메서드를 때리는 것이다.

 

OS가 콜백 하면 main 스레드가

이벤트 루프에 등록한다.

 

실행은 되지 않고 등록만 하는 것이다.

 

이벤트 루프는 큐라서

순차적으로 이벤트들이 등록된다.

이벤트 루프 큐에는 이벤트 메서드들의

코드 내부가 들어오는 것이다.

 

이벤트 루프는 지속적으로

들어오는 이벤트들을 검사하고

가장 앞에 있는 이벤트를

main 스레드가 실행한다.

 

실행하는 행위를 이벤트 처리라고 한다.

 

main 스레드 하나로 모든 이벤트를

처리하려고 할 때

가장 앞에 있는 right 메서드가 끝나지 않는다면

다음 큐에 대기 중인 이벤트는

실행되지 못한다.

 

main 스레드가 너무 바쁘기 때문이다.

 

그렇기 때문에 이벤트 처리는

새로운 스레드에게 맡겨야 한다.

 

main 스레드가 동시에 이벤트 처리를 할 수 없기 때문에

이벤트가 들어올 때마다 새로운 스레드를 생성한다.

 

 

 

for (int i = 0; i < 75; i++) {
	y = y - 10;
	setLocation(x, y); // 그림 다시 그리기

	try {
		Thread.sleep(5);
	} catch (Exception e) {
		e.printStackTrace();
	}
}

키보드의 입력을 받으면

OS가 콜백해주어

main 스레드가

위 코드 스택을 이벤트 루프에 등록한다.

 

이 스택은 75번의 연산과,

75번의 그림을 그린다.

 

연산은 cpu가 하고, 그림은 모니터가 그리는데

 

사실상 cpu가 75번의 연산을 끝낸 후에

모니터가 그림을 한번 그린다.

 

 cpu가 한번 연산하고 

모니터에게 그림 그리라고

제어권을 주지 않는다.

 

main 스레드가 혼자 일하고 있기 때문이다.

 

1번 연산하고 1번 그림을 그리면

context switching이 너무 많이 일어나서

main 스레드가 너무 바쁘고,

cpu가 멍 때리는 시간이 많아지게 되기 때문이다.

 

실제 코드가 그림을 75번 그리게 짜여있어도

모든 연산이 끝난 후 마지막

한 번만 그림을 그리게 된다.

 

여기서 규칙을 한 가지 알 수 있다.

 

모든 GUI는 이벤트 루프에 들어온 스택이

모두 종료되면 그림을 다시 그린다.

 

이때 새로운 스레드를 사용하면 페이크를 주어

규칙을 피해 갈 수 있다.

 

새로운 스레드를 생성해

이벤트 스택을 실행시키면

 

main 스레드는 스택을 때려주기만 하고

할 일이 끝났다고 생각해

그림을 그려버린다.

 

main 스레드의 입장에서는

이벤트 처리가 굉장히 빨라지는 것이다.

 

 

규칙!

하나의 이벤트가 종료되어야(이벤트 처리가 끝나야 = 스택이 종료되어야)
그림을 그린다. (= 그림을 다시 그리는 시점!)

 

 

 

[출처]

 

https://cafe.naver.com/metacoding

 

메타코딩 : 네이버 카페

코린이들의 궁금증

cafe.naver.com

 

메타 코딩 유튜브

https://www.youtube.com/c/%EB%A9%94%ED%83%80%EC%BD%94%EB%94%A9

 

메타코딩

문의사항 : getinthere@naver.com 인스타그램 : https://www.instagram.com/meta4pm 깃헙 : https://github.com/codingspecialist 유료강좌 : https://www.easyupclass.com

www.youtube.com

 

반응형