도순씨의 코딩일지

자바 :: 스레드에 관하여 (볼링 예제) 본문

𝐏𝐑𝐎𝐆𝐑𝐀𝐌𝐌𝐈𝐍𝐆/𝐉𝐀𝐕𝐀

자바 :: 스레드에 관하여 (볼링 예제)

도순씨 2020. 7. 13. 22:47

학교 프로젝트로 '볼링 게임 만들기' 프로젝트를 진행 했었다

객체지향 프로그래밍 개념도 잘 모르고 GUI 개념도 잘 몰랐던 나에게는 큰 고난이었다(...)

교수님이 주신 조건 중에서는 '플레이어들이 번갈아가며 볼링 공을 던지고, 이를 바로 점수판에 표시하라'라는 조건이 있었다

 

한참을 뒤적이던 나는 스레드 라는 개념이 있다는 것을 알게 되었다.

 

스레드를 볼링에 적용하여 설명해보자면 하나의 player라고 생각하면 된다.

각각의 플레이어들은 번갈아가며 공을 던진다.

원래 프로그램이라면 하나의 플레이어가 순차적으로 모든 과정을 끝낸 뒤에 다음 플레이어의 과정이 실행이 되겠지만

스레드를 적용하면 플레이어 1의 1라운드 - 플레이어 2의 1라운드 - 플레이어 1의 2라운드 ~ 와 같은 식으로 진행된다.

다시 말해, 두개의 객체가 프로그램을 번갈아가며 점유한다고 생각하면 된다. 

 

자바에서 스레드 코드를 작성하는 방법은 다음과 같은 두 가지 방법이 있다.

 

  • Thread 클래스 이용
  • Runnable 인터페이스 이용

그 중에서 나는 Runnable 인터페이스를 이용하는 예제 코드를 작성하고자 한다

 

class PlayBowling{
		public PlayBowling(){
			ThreadPlayer threadPlayer1 = new ThreadPlayer();
			ThreadPlayer threadPlayer2 = new ThreadPlayer();
			Thread thread1 = new Thread(threadPlayer1, "아이린");
			Thread thread2 = new Thread(threadPlayer2, "슬기");
			System.out.println("******** 볼링 결과 ********\n");
			
			thread1.start();
			thread2.start();
		}
	}
	
	class ThreadPlayer implements Runnable{
		public void run() {
			Score s = new Score();
			s.setKind();
			for(int i = 0 ; i < 10 ; i++) {
				s.randomNum(i);
				try {
					Thread.sleep(100);
				} catch(InterruptedException e) {
					System.out.println("오류");
				}
			}
		}
	}
}

들여쓰기가 조금 이상하게 돼서 이해하기 어려울 수 있으나

PlayBowling 클래스에서 ThreadPlayer 클래스를 기반으로 스레드를 실행시키고 있다.

 

먼저 ThreadPlayer 클래스는 Runnable 인터페이스를 이용하여 run 메소드를 실행하고 있다

Score s = new Score()와 s.setKind는 무시하여도 좋다.

for 문을 이용하여 10개의 라운드를 생성하고 랜덤 문자를 생성한 뒤 스레드를 잠들게 한다.(sleep)

이 때 sleep() 괄호 안에 들어가 있는 숫자는 밀리세컨드 단위이다.

 

PlayBowling 클래스는 생성자를 이용하여 스레드를 두 개 생성하고 (원한다면 더 생성 가능하다)

스레드를 시작한다.

 

 

synchronized 키워드는 자바의 스레드 동기화를 위한 것이다.

잠금을 걸어서 다른 스레드가 사용할 수 없도록 하는 것이다.

synchronized(공유객체)와 같은 방식으로 이용한다.

 

 

 

Comments