본문 바로가기
혼공학습단

[혼공학습단7기] 4주차 기본 미션, 선택 미션

by Kimpeep 2022. 2. 12.

01. 기본 미션 : p.550 [직접 해보는 손코딩] 코딩 과정 및 실행 결과 캡쳐하기


AutoSaveThread.java

package sec02.exam05;

public class AutoSaveThread extends Thread {
    public void save() {
        System.out.println("작업 내용을 저장함.");
    }

    @Override
    public void run() {
        while(true){
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                break;
            }
            save();
            }
        }
    }

DaemonExample.java

package sec02.exam05;

public class DaemonExample {
    public static void main(String[] args) {
        AutoSaveThread autoSaveThread = new AutoSaveThread();
        autoSaveThread.setDaemon(true);
        autoSaveThread.start();

        try {
            Thread.sleep(4000);
        } catch (InterruptedException e) {
        }

        System.out.println("메인 스레드 종료");
    }
}

실행 결과

 

교재에서는 Thread.sleep() 부분이 3000이었으나, 실행 결과를 책와 동일하게 출력하기 위해서는 4000으로 설정해야 했다.

왜 그럴까? 한번 생각을 해 봅시다~!

1. 1000ms가 지날 때마다 "작업 내용을 저장함."을 출력함

2. 3000ms가 지나면 스레드를 종료함.

3. 0초일 때 작업 내용을 저장하지 않았고, 1초일 때 1번 저장, 2초일 때 2번째 저장을 한다.

4. 3초가 지난 뒤에는 저장보다 메인 스레드 종료가 먼저 진행되기 때문에, 3000으로 설정할 경우 다음과 같은 결과가 출력된다.

Thread.sleep(3000)

 

02. 선택 미션 : p.539 문제 2번 풀고, 풀이 과정 설명하기


ThreadExample.java

package sec01.verify.exam02;

public class ThreadExample {
    public static void main(String[] args) {
        Thread thread1 = new MovieThread();
        thread1.start();

        Thread thread2 = new Thread(new MusicRunnable());
        thread2.start();
    }
}

MovieThread.java

package sec01.verify.exam02;

public class MovieThread extends Thread {
    @Override
    public void run() {
        for(int i=0;i<3;i++){
            System.out.println("동영상을 재생합니다.");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e){
            }
        }
    }
}

MusicRunnable.java

package sec01.verify.exam02;

public class MusicRunnable implements Runnable {
    @Override
    public void run() {
        for(int i=0;i<3;i++) {
            System.out.println("음악을 재생합니다.");
        }
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
        }
    }
}

1. new MusicRunnable()

MusicRunnable을 매개값으로 갖는 생성자를 호출하는 것이기 때문에, 뒤에 ()를 붙여 주어야 합니다.

 

2. extends Thread

부모에서 선언 / 정의를 모두 진행하며, 자식은 메소드 / 변수를 그대로 사용할 수 있습니다.

본 코드는 Thread를 상속받기 위하여 사용합니다.

 

3. implements Runnable

extends와 달리, 부모 객체는 선언만 하며 정의는 자식에서 오버라이딩 해서 사용해야합니다.

즉, run() 상위에 @Override가 있기 때문에 extends가 아닌 implements를 사용합니다.

 


오랜만에 뵙는 것 같은데 기분 탓이 아니겠죠?

저는 요번 주에 학생회장으로서의 임무를 다하고... 장렬히... 전사하러 가려고 합니다...

코에 바람도 좀 넣고 왔는데 오미크론도 같이 안 넣어졌길 간절히 바라야겠네요 ^_T...

 

다들 건강 조심 항상 코로나 조심하고...~ 건강이 제일인 거 아시죠?

다음 주에도 재미있게 봅싀다...

댓글