Thread 스레드를 활용한 간단한 카운터 프로그램을 만들어보겠습니다.
💡확인하기
- OS : Windows 11
- JDK : 17
- IDE : IntelliJ
Thread를 사용하여 초 단위로 카운터 프로그램을 작성해 봅시다.
요구사항
- 카운팅 할 시간(초 단위)를 사용자에게 입력받습니다.
- 사용자가 시간을 입력하지 않으면 기본값을 할당합니다.
- Thread를 확장한 클래스를 작성합니다.
- main에서 Thread 서브 클래스의 인스턴스를 생성하고 호출하는 방식으로 실행합니다.
👇👇 전체 소스는 하단에 👇👇
구현하기
1. Thread 서브 클래스 작성
Thread를 확장한 클래스를 작성합니다.
class CounterThread extends Thread {
}
카운팅할 초를 저장할 정수형 멤버변수를 생성합니다.
int seconds;
생성자
초는 인스턴스 생성 시 기본값으로 초기화 작업을 하기 위해 기본 생성자를 작성합니다.
public CounterThread() {
this.seconds = 20; // 기본값 자유
}
사용자가 입력한 시간을 파라미터로 받아 초기화하는 커스텀 생성자를 작성합니다.
public CounterThread(int seconds) {
this.seconds = seconds;
}
기본 생성자와 커스텀 생성자는 값이 다를 뿐 seconds 변수를 초기화하는 로직은 동일하네요.
기본 생성자에서 seconds 변수를 직접 초기화하지 않고 커스텀 생성자를 호출하여 초기화하도록 변경합니다.
public CounterThread() {
this(20);
}
Overriding run() - 재정의하기
run() 메소드를 override 하겠습니다.
run 내부는 thread에서 동작하는 실제 로직이 들어가는 부분이죠.
seconds 초가 0이 될 때까지 반복하는 루프를 작성합니다.
루프의 마지막에 seconds 변수 값을 변경시킵니다.
@Override
public void run() {
while (this.seconds > 0) {
System.out.println(this.seconds + "초 전"); // 확인하기 위한 출력
this.seconds--;
}
}
이 상태로 실행시킨다면, while 문은 엄청나게 빨리 끝나버리겠죠..
while 문은 초 단위로 실행돼야 하므로, thread의 sleep 메소드를 호출하여 1초 동안 일시정지합니다.
try {
sleep(1000);
} catch (Exception e) {
}
2. main 클래스 작성
사용자에게 카운팅 할 시간을 입력받습니다.
시간은 0보다 큰 값이어야 하고, 시간을 입력하지 않았을 경우 기본값으로 설정합니다.
String str = scan.nextLine();
int sec = Integer.parseInt(str);
if (sec <= 0) {
System.out.print("시간은 0보다 커야 합니다. ");
}
입력한 시간으로 위에서 작성한 CounterThread 클래스의 인스턴스를 생성합니다.
CounterThread t = str.equals("")
? new CounterThread()
: new CounterThread(cnt)
;
스레드를 시작합니다.
t.start();
실행결과
전체소스 보기
// CounterThread.class
public class CountThread extends Thread {
int seconds;
// constructor
/**
* 초기화 - 초 기본설정
*/
public CountThread() {
this(20); // 다른 생성자 호출
}
/**
* 초기화
* @param sec 초
*/
public CountThread(int sec) {
this.seconds = sec;
}
@Override
public void run() {
System.out.println("========= START Count =========");
System.out.println(this.seconds + "초 카운트를 시작합니다.");
// 날짜 출력 포맷 설정
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss", Locale.KOREAN);
while (this.seconds > 0) {
System.out.println(formatter.format(new Date()) + "\t\t" + this.seconds + "초 전");
this.seconds--;
// 1초간 멈춤
try {
sleep(1000);
} catch (Exception e) {
e.printStackTrace();
}
} // END while
System.out.println("========= END Count =========");
} // END run
}
// main
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
// 카운팅 시간 변수
int sec = -1;
System.out.print("카운팅할 시간을 초단위 정수로 입력하세요(기본값 20초 사용하려면 빈값) > ");
while (true) {
String str = scan.nextLine();
if (str.equals("")) {
// 기본값
break;
} else {
try {
sec = Integer.parseInt(str);
if (sec <= 0) {
throw new Exception("시간은 0보다 커야 합니다");
}
break;
} catch (NumberFormatException e1) {
System.out.print("\t정수를 입력하세요 > ");
} catch(Exception e2) {
System.out.print("\t" + e2.getMessage() + " > ");
}
}
} // END while
// 카운트
CountThread t = sec < 0 ? new CountThread() : new CountThread(sec);
t.start();
}
'Language > JAVA' 카테고리의 다른 글
[JAVA] Thread(스레드)와 State(상태) (1) | 2024.04.05 |
---|---|
[JAVA] Memory Structure(메모리 구조)와 Wrapper Class (24) | 2024.04.04 |
[JAVA] 간단한 console 프로젝트 정수 계산기 프로그램 만들기 with IntelliJ (13) | 2024.04.03 |
[JAVA] method Overloading vs. Overriding(메소드 오버로딩 vs. 오버라이딩) (1) | 2024.04.02 |
[JAVA] Class Inheritance 클래스 상속 (27) | 2024.04.01 |