3월달 정처기 시험도 겹쳐버리는 바람에 자바에 신경을 많이 못쓰고 있습니다...

작년 3회차 시험에 다 알거라고 자만하고 갔다가 한번 떨어지는 바람에 이번엔 한달정도의 공부를 하고 가야겠다고 마음 먹었습니다!! 그래도 자바는 놓지 않겠다!!

 

4주차 미션은 다음과 같습니다

 

우선 선택미션 부터 한번 보겠습니다


문제 2번. 동영상과 음악을 재생하기 위해 두가지 스레드를 실행하려고 합니다. ① ~ ③에 적당한 코드를 넣어보세요.

 

// MovieThread.java
public class MovieThread extends Thread{ // <-- 2번자리
	@Override
    public void run(){
        for(int i = 0; i < 3; i++){
            System.out.println("동영상을 재생합니다.");
            try{
                Thread.sleep(1000);
            }catch (InterruptedException e) {
            }
        }
    }
}
// MusicRunnable.java
public class MusicRunnable implements Runnable{ //<-- 3번자리
	@Override
    public void run(){
        for(int i = 0; i < 3; i++){
            System.out.println("음악을 재생합니다.");
            try{
                Thread.sleep(1000);
            }catch (InterruptedException e){
            }
        }
    }
}
//ThreadExample.java
public class ThreadExample {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Thread thread1 = new MovieThread();
        thread1.start();

        Thread thread2 = new Thread(new MusicRunnable());	// <- 1번 자리
        thread2.start();
	}

}

정답과 풀이를 알아 보자면

 

1번 new MusicRunnable()은 생성/Runnable을 매개값으로 갖는생성자를 호출하는 것이고

2번 extends Thread는 Thread의 하위 클래스로 작업 스레드를 정의하고 내용을 포함시키는 방법입니다.

3번 implements Runnable은 runnable의 구현클래스 입니다.

 

2번 문제의 실행 결과는 다음과 같습니다.

 

 


기본미션은 550p 코딩 과정 및 실행 결과

 

이 문제는 데몬스레드에 대한 문제인 것 같았습니다.

 

  • 데몬스레드는 주 스레드의 작업을 돕는 보조적인 역할을 수행하는 스레드입니다.
  • 주 스레드가 종료되면 데몬 스레드는 강제적으로 자동 종료되는데, 그 이유는 보조 역할을 수행하므로 존재의미가 사라지기 때문.
  • 스레드를 데몬으로 만들기 위해서는 주 스레드가 데몬이 될 스레드의 setDaemon(true)를 호출
  • 주의 할 점은 start()메소드가 호출되고 나서 setDaemon(true)를 호출하면 IllegalThreadStateException이 발생하기 때문에 start() 메소드 호출 전에 setDaemon(true)를 호출해야 한다.

예제) 1초 주기로 save()메소드를 자동 호출하도록 AutoSave Thread를 작성하고, 메인 스레드가 3초후 종료되면 AutoSaveThread도 같이 종료되도록 AutoSaveThread를 데몬스레드로 만들었습니다.

 

코드는 다음과 같습니다

// AutoSaveThread.java

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();
		}
	}
}
// DaemonExaple.java

public class DaemonExaple {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		AutoSaveThread autoSaveThread = new AutoSaveThread();
		autoSaveThread.setDaemon(true);
		autoSaveThread.start();
		
		try {
			Thread.sleep(3000);
		} catch (InterruptedException e) {
			
		
		}
		System.out.println("메인 스레드 종료");
	}

}

 

실행결과

 

책에서의 실행결과는 작업내용을 저장함이 3번나오고 스레드가 종료되는데 코드를 작성하면 저장을 2번하고 종료를 합니다. 이게 왜이런가 봤더니 Thread.sleep 부분이 3000으로 되어있기 때문에 2번저장 그리고 종료가 되는것이 맞습니다. 책의 결과처럼 저장을3번하고 종료하려면 Thread.sleep(4000)으로 하면 책과 같은 결과값이 나옵니다.

복사했습니다!