본문 바로가기
IT /1) 자바

자바독학) Thread,Runnable,Daemon

by 세세tv 2019. 10. 27.

 

프로젝트명 : G8_Thread

패키지명 : runnable

클래스명 : RunnableMain, Thread1

 

runnable 배워보겠습니다.

 

 

기존까지는 extends를 사용하여 Thread를 상속받았습니다.

상속은 한 개만 가능하니 여러 개를 사용할 수 있는

implements를 사용하여 Thread를 구현하는 방법을 알아보겠습니다.

 

implements를 사용하면 interface와 같이 무언가를 오버라이딩해야 합니다.

오류가 발생하고 있죠??

 

 

마우스 올려서 메서드를 추가하겠습니다.

무언가를 오버라이딩 하는 거겠죠??

 

 

run을 오버라이딩했습니다

Thread와 같은 추상메서드입니다.

 

내용 한번 넣어보겠습니다

0~10까지 반복하여 출력하는 while문입니다

 

 

메인으로 이동하여 Thread1을 호출하고

start();를 통해 실행하고 싶은데

 

또 오류가 발생하는군요...ㅂㄷㅂㄷ

 

 

run을 실행하기 위해서는 Thread가 필요합니다.

Thread의 소괄호()에 run을 가진 클래스를 넣어줍니다.

 

Thread를 통해 실행시켜줘야 합니다.

 

extends를 사용하는 경우 꼭 implements를 사용해야 하기에

알아두셔야 할 부분입니다.

 

 

패키지명 : Work

클래스명 : T_Main

 

키보드에서 정수를 입력받으면

입력받은 숫자가 1씩 감소하며 출력됩니다.

 

숫자가 0이 되면 "종료"라는 메시지와 함께

프로그램을 종료하는 코드를 만들어 보겠습니다.

 

 

우선 스캐너를 사용하여 정수를 입력받겠습니다.

 

 

클래스명 : T_Class

 

private를 사용하여 입력 문자를 받아주겠습니다.

setter를 사용하여 메인에서 입력한 값을 가져옵니다.

 

implements를 사용하여 Runnable을 구현했습니다.

run메서드에서 코드를 짜 봅시다.

 

for문으로

for(int i = num; i >= 0; i--)

 

i는 메인에서 입력받은 값으로 시작하며

0과 같아질 때까지 감소합니다.

 

try/catch에서 1초 대기를 걸어줍니다.

 

출력-1초대기-출력-1초대기.....를 반복합니다.

이후 i가 0이 되고 조건문을 빠져나오면

하단에 "[종료]"를 출력하고 프로그램은 끝이 납니다.

 

 

메인으로 이동하여 T_Class를 호출합니다.

setter를 사용하여 Scanner를 사용해서 입력한

me를 넣어주겠습니다.

 

runnable을 사용하기 위해 Thread 생성하여 T_Class 넣어주겠습니다.

t.start();를 사용하여 run을 실행시키겠습니다.

 

10~0까지 1초마다 출력이 되는 것을

확인하시면 되겠습니다

 

 

패키지명 : b6_Daemon

클래스명 : AutoSave, DaemonMain

 

이번에는 데몬 배워보겠습니다.

 

 

Runnable을 사용하여 Thread.sleep을 사용하겠습니다.

게임을 하면 5초마다 자동 저장을 한다고 가정하겠습니다.

 

일단 예시로 그냥 저장 중이라고 출력만 하겠습니다.

 

 

기존과 같이 클래스 호출하고,

Thread 호출하고~ start();를 사용하여 run메서드를 호출합니다.

 

메인에서는 1초마다 게임 중이라고 가정하겠습니다.

 

게임 진행 중에 계속 자동 저장을 합니다.

 

하지만! 게임이 끝나도 run은 계속 작동합니다.

메인에서의 Thread.sleep가 종료되면

run메서드도 같이 종료되게 만들어보겠습니다.

 

우선 콘솔에서 빨간 네모 클릭하여 멈춰주겠습니다.

 

 

메인에서 t.setDaemon(true)를 넣어보겠습니다.

Thread t에는 AutoSave라는 클래스를 가지고 있죠?

소괄호()를 파라미터라고 생각하시면 됩니다.

 

Thread라는 자바 클래스에 AutoSave를 넣어준 겁니다.

데몬을 통해 as와 연결해주겠습니다.

 

메인에서의 Thread가 종료되면 as(AutoSave)의 Thread도 같이 종료됩니다.

as의 Thread는 Runnable이 되겠죠?

 

 

패키지명 : b7_Work

클래스명 : WorkMain, WorkThread

 

클래스 2개 생성하겠습니다.

 

문제입니다.

1~100 사이의 난수 두 개를 생성합니다.

난수 두 개를 더한 값이 정답입니다.

 

5개를 다 맞추면 소요시간이 몇 초인지

출력되게 해 주시면 됩니다.

 

오답을 입력하면 새로운 문제를 출제하겠습니다.

데몬 스레드를 사용하면 너무 쉬우니

데몬 없이 만들어보겠습니다.

 

풀이해보시고 정 안되면 같이 보겠습니다.

 

 

변수 굉장히 많이 만들었습니다.

Thread는 extends를 사용했습니다.

 

Random과 Scanner를 생성했습니다.

모든 변수는 private으로 생성했습니다.

 

int형의 숫자 1, 숫자 2와 시간을 체크하겠습니다.

boolean으로 반복문을 제어하겠습니다.

 

상수 FINISH를 생성하여 5를 넣어주었습니다.

cnt를 생성하여 정답을 카운트했습니다.

 

물론 코드를 더 줄일 수 있지만!

교육 목적이므로 최대한 여러 가지를 넣었습니다.

 

run은 당연히 오버라이딩 해줘야겠죠?

 

 

게임을 시작하는 메서드를 생성하겠습니다.

public void startGame입니다.

 

try/catch로 생성하였습니다.

오류를 잡기 위함인데요

catch에 "정답은 정수로 입력하세요"라는 문구만 넣겠습니다.

 

su1과 su2에 랜덤으로 숫자를 넣어주고 문제를 출력해주었습니다

 

"su1 + su2 ="

위와 같이 문제를 생성하고 정답을 입력받습니다.

 

if문입니다.

입력값과 su1+su2가 같다면

정답입니다.

cnt++;을 통해 횟수를 증가시켜주겠습니다.

 

else문입니다.

su1+su2가 입력받은 값이 아니라면 오답입니다.

continue;를 사용하여 while문의 가장 처음으로 이동하여

난수를 새로 만들겠습니다.

 

if문입니다.

cnt == FINISH와 동일하다면 5회 정답으로

반복문을 종료하겠습니다.

isCheck = false를 통해 반복문을 종료하고

timer를 출력하여 소요시간을 출력하겠습니다.

 

이제 타이머를 생성해야겠죠? 

 

 

run메서드에서 while문 생성하겠습니다.

조건식에는 isCheck를 넣겠습니다.

 

startGame에서 정답이 5회가 되어 종료되면

isCheck가 false가 되니 같이 종료되겠죠?

 

Daemon을 대신하여 이렇게 사용하셔도 좋습니다.

try/catch를 사용하여 1초마다 timer++;을 통해

1초마다 timer이 1씩 증가하게 해 주겠습니다.

 

 

main으로 이동하여

WorkThread을 wt라는 이름으로 호출하였습니다

 

wt.start();를 사용하여 timer를 증가시키고

wt.startGame();를 호출하여 문제를 출력합니다.

 

wt.start();가 startGame();보다 무조건 위에 있어야 합니다.

위치 옮겨보면 아시겠지만 게임이 끝난 후 체크하게 되어

0초라고 출력이 됩니다.

 

만약에 무언가를 만들다가 시간 체크가 잘 안된다면

위치를 확인해보시면 되겠습니다.

 

여기서 Thread는 구현이 아닌 상속을 받았기에

메인에서 따로 Thread를 호출하지 않으셔도 됩니다.

댓글