옹실이의 개발이야기

Java

Java 타이머 : 멀티스레드를 이용한 10초 타이머

옹실 2020. 12. 6. 00:03

전에 했던 프로젝트를 다시 손보면서
멀티 스레드를 활용해 타이머를 작업하게 됐다.
구글링해보니 Timer와 TimerTask를 활용해 타이머를 구현하는 방법도 있었지만
나는 좀 더 쉬운 방식으로 구현했다.

내가 사용한 방식은 이해하기는 더 쉽지만
타이머를 제어하는 게 Timer랑 TimerTask를 이용하는 것보다 더 복잡한 듯
(로직 새로 생각해봐야함)

 

1. 스레드를 이용한 10초 타이머 클래스 생성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
    int sec = 10//타이머 시간 10초로 지정
    class myTimer extends Thread {
        final long timeInterval = 1000;
        
        public void run(){
                while(sec>=0){
                    showSystemMsg("//Time"+"00:"+String.valueOf(sec));
                    System.out.println("00:"+String.valueOf(sec));
                    sec--;
                    try{
                        Thread.sleep(timeInterval);
                    }catch(InterruptedException e){
                        e.printStackTrace();
                    }            
                    if(sec == 0){
                        showSystemMsg("//End"+"Time Out!게임 종료!");
                        //System.out.println("Time Out!");
 
                    }
                }
 
        }
    }
cs

while문을 사용해서 10이 0이 될 때까지 sec--로 10을 1개씩 줄어들게 만들었다.

showSystemMsg();는 게임 로직상 모듈에서 클라이언트에게
하나씩 줄어드는 초를 쏴주기 위해 만든 메소드이고,
타이머에 대한 결과값은 별도로 System.out.println();으로 cmd창에 뜨게 만들었다.

메시지를 보낼 때 "//Time"이라는 프로토콜과 함께,
String으로 바꿔서 보내기 위해 String.valueOf()안에 sec을 넣어서
int타입을 String으로 바꿔서 메시지를 보냈다.

Thread.sleep(timeInterval);은 1초씩 줄어들도록 만들기 위해
sleep();으로 일정한 시간 간격을 주었다.

마지막에 0초가 됐을 때,
클라이언트한테 "//End" 프로토콜과 함께
Time Out으로 게임이 종료되었다는 메시지를 보내주었다.

 

2. 멀티로 스레드 호출

1
2
3
4
                qs.gameStart = true;
                Exam ex = new Exam(); ex.start();
                myTimer myTimer = new myTimer();
                myTimer.start();
cs

gameStart 했을 때(true일 때)
Exam이라는 스레드를 호출해서 ex.start()로 시작시키고,
위에서 작성한 myTimer 스레드도 호출해서 myTimer.start()로 시작시켰다.

나는 이렇게 사용했지만,
오늘 포스팅에 해당하는 구문은 3,4번 라인만 해당하니
경우에 따라 스레드를 시작시키면 될 듯하다.

 

결과 ▼

클라이언트 화면에도 뜨지만, 한번에 캡처할 수 없어서
한 번에 볼 수 있는 cmd창이랑 같이 붙여서 캡처했다.
타이머가 종료됐을 때 클라이언트의 채팅창에
위에서 적었던 Time Out, 게임 종료 메시지가 잘 뜬다.