전에 했던 프로젝트를 다시 손보면서
멀티 스레드를 활용해 타이머를 작업하게 됐다.
구글링해보니 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, 게임 종료 메시지가 잘 뜬다.
'Java' 카테고리의 다른 글
Java IO/equals() : 파일 내용 읽어온 후 equals()로 텍스트 비교 (0) | 2020.12.10 |
---|---|
Java 구구단 : 이중 for문을 이용한 구구단 (0) | 2020.11.23 |
Java 별찍기 : 이중 for문을 활용한 별(*) 찍기 (0) | 2020.11.19 |
Java 퀴즈 : 주어진 시간동안 문제 맞추는 O,X 퀴즈(멀티 쓰레드 활용) (0) | 2020.11.11 |
Java 멀티로또 : 명단파일, 숫자 입력받아서 숫자만큼 랜덤 뽑기 (0) | 2020.11.09 |