Notice
Recent Posts
Recent Comments
Link
«   2025/09   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
Tags
more
Archives
Today
Total
관리 메뉴

UniCode

[이것이 자바다]CH12.멀티 스레드(확인문제풀이) 본문

이것이 자바다

[이것이 자바다]CH12.멀티 스레드(확인문제풀이)

Uni_code 2021. 5. 15. 14:38

1. 스레드에 대한 설명 중 틀린 것은 무엇입니까?

① 자바 애플리케이션은 메인(main) 스레드가 main() 메소드를 실행시킨다.

② 작업 스레드 클래스는 Thread 클래스를 상속해서 만들 수 있다.

③ Runnable 객체는 스레드가 실행해야 할 코드를 가지고 있는 객체라고 볼 수 있다.

④ 스레드 실행을 시작하려면 run() 메소드를 호출해야 한다

 

☞ ④ 스레드 실행을 시작하려면 run() 메소드를 호출해야 한다.

스레드를 실행하려면 start() 메소드를 호출해야 한다.

 

2. 동영상과 음악을 재생하기 위해 두 가지 스레드를 실행하려고 합니다. 비어 있는 부분에 적당한 코드를 넣어 보세요.

//[ThreadExample.java]

public class ThreadExample{
	public static void main(String[] args){
    	Thread thread1 = new MovieThread();
        thread1.start();
        
        //1)
        Thread thread2 = new Thread(new MusicThread());
        //2)
        //Runnable musicRunnable = new MusicRunnable();
        // Thread thread2 = new Thread(musicRunnable);
        thread2.start();
    }
}
//[MovieThread.java]
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]
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) { }
        }
    }
}

 

3. 스레드의 우선순위에 대한 설명 중 틀린 것은 무엇입니까?

① 우선순위가 높은 스레드가 실행 기회를 더 많이 가질 수 있다.

② 우선순위는 1부터 10까지 줄 수 있는데, 디폴트는 5이다.

③ Thread 클래스는 NORM_PRIORITY, MIN_PRIORITY, MAX_PRIORITY 상수를 제공한다.

④ 1은 가장 높은 우선순위이기 때문에 다른 스레드보다 실행 기회를 더 많이 갖는다.

 

☞ ④ 1은 가장 높은 우선순위이기 때문에 다른 스레드보다 실행 기회를 더 많이 갖는다.

스레드의 우선순위는 10이 가장 높다.

 

4. 동기화 메소드와 동기화 블록에 대한 설명 중 틀린 것은 무엇입니까?

① 동기화 메소드와 동기화 블록은 싱글(단일) 스레드 환경에서는 필요 없다.

② 스레드가 동기화 메소드를 실행할 때 다른 스레드는 일반 메소드를 호출할 수 없다.

③ 스레드가 동기화 메소드를 실행할 때 다른 스레드는 다른 동기화 메소드를 호출할 수 없다.

④ 스레드가 동기화 블록을 실행할 때 다른 스레드는 다른 동기화 메소드를 호출할 수 없다.

 

② 스레드가 동기화 메소드를 실행할 때 다른 스레드는 일반 메소드를 호출할 수 없다.

동기화 메소드와 동기화 블록이 여러 개 있을 경우, 스레드가 이들 중 하나를 실행할 때 다른 스레드는 해당 메소드는 물론이고 다른 동기화 메소드 및 동기화 블록도 실행할 수 없다. 하지만 일반 메소드는 호출이 가능하다.

 

5. 스레드 일시 정지 상태에 대한 설명 중 틀린 것은 무엇입니까?

① 일시 정지 상태는 BLOCKED, WAITING, TIMED_WAITING이 있다.

② 스레드가 동기화 메소드를 실행할 때 다른 스레드가 동기화 메소드를 호출하게 되면 BLOCKED 일시 정지 상태가 된다.

③ 동기화 메소드 내에서 wait()를 호출하면 WAITING 일시 정지 상태가 된다.

④ yield() 메소드를 호출하면 TIMED_WAITING 일시 정지 상태가 된다.

 

④ yield() 메소드를 호출하면 TIMED_WAITING 일시 정지 상태가 된다.

yield() 메소드는 호출 시 우선순위가 동일한 다른 스레드에게 실행을 양보하고 실행대기 상태가 된다.

 

6. 스레드 상태 제어를 하는 메소드에 대한 설명 중 틀린 것은 무엇입니까?

① yeild() 메소드를 호출한 스레드는 동일한 우선순위나 높은 우선순위의 스레드에게 실행 기회를 양보하고 자신은 실행 대기 상태가 된다.

② sleep() 메소드를 호출한 스레드는 주어진 시간동안 일시 정지 상태가 된다.

③ stop() 메소드는 스레드를 즉시 종료시키기 때문에 스레드 안전성에 좋지 못하다.

④ join() 메소드를 호출한 스레드가 종료할 때까지 join() 메소드를 멤버로 가지는 스레드는 일시 정지 상태가 된다.

 

④ join() 메소드를 호출한 스레드가 종료할 때까지 join() 메소드를 멤버로 가지는 스레드는 일시 정지 상태가 된다.

join() 메소드를 호출한 스레드> 일시 정지 상태

실행 대기 상태로 가려면, join() 메소드를 멤버로 가지는 스레드가 종료되거나, 매개값으로 주어진 시간이 지나야 한다.

 

7. interrupt() 메소드를 호출한 효과에 대한 설명 중 틀린 것은 무엇입니까?

① 일시 정지 상태에서 InterruptedException을 발생시킨다.

② 스레드는 즉시 종료한다.

③ 실행 대기 상태에서 호출되면 일시 정지 상태가 될 때까지 InterruptedException이 발생하지않는다.

④ 아직 InterruptedException이 발생하지 않았다면 interrupted(), isInterrupted() 메소드는 true를 리턴한다.

 

☞ ② 스레드는 즉시 종료한다. //=>stop()메소드

 interrupt() 메소드는 스레드가 일시 정지 상태에 있을 때 InterruptedException 예외를 발생하여 catch블록으로 이동  run() 메소드를 정상 종료

 

8. 메인 스레드에서 1초 후 MovieThread의 interrupt() 메소드를 호출해서 MovieThread를 안전하게 종료하고 싶습니다. 비어 있는 부분에 적당한 코드를 작성해보세요.

public class ThreadExample{
	public static void main(String[] args){
    	Thread thread = new MovieThread();
        thread.start();
        
        try{ Thread.sleep(1000); } catch(InterruptedException e) { }
        
        thread.interrupt();
    }
}
public class MovieThread extends Thread{
	@Override
    public void run(){
    	while(true){
        	System.out.println("동영상을 재생합니다");
            if(Thread.interrupted()){
            	break;
            }
        }
        System.out.println("종료");
    }
}

interrupted() : 정적 메소드로 현재 스레드가 interruped 되었는지 확인하는 것

> boolean status = Thread.interrupted();

isInterruted() : 인스턴스 메소드로 현재 스레드가 interruped 되었는지 확인할 때 사용

> boolean status = objThread.isInterrupted();

 

9. wait() 와 notify() 메소드에 대한 설명 중 틀린 것은 무엇입니까?

① 스레드가 wait()를 호출하면 일시 정지 상태가 된다.

② 스레드가 notify()를 호출하면 wait()로 일시 정지 상태에 있던 다른 스레드가 실행 대기 상태가 된다.

③ wait() 와 notify() 는 동기화 메소드 또는 블록에서 호출할 필요가 없다.

④ 스레드가 wait(long millis)를 호출하면 notify() 가 호출되지 않아도 주어진 시간이 지나면 자동으로 실행 대기 상태가 된다.

 

☞ ③ wait() 와 notify() 는 동기화 메소드 또는 블록에서 호출할 필요가 없다.

wait() > 동기화 블록 내에서 스레드를 일시 정지 상태로 만든다.notify() >동기화 블록 내에서 wait() 메소드에 의해 일시 정지 상태에 있는 스레드를 실행 대기 상태로 만든다.

 

10. 메인 스레드가 종료하면 MovieThread도 같이 종료되게 만들고 싶습니다. 비어 있는 부분에 적당한 코드를 넣어 보세요.

public class ThreadExample{
	public static void main(String[] args){
    	Thread thread = new MovieThread();
        thread.setDaemon(true);
        thread.start();
        
        try{ Thread.sleep(3000); } catch(InterruptedException e) {}
    }
}
public class MovieThread extends Thread{
	@Override
    public void run() {
    	while(true){
        	System.out.println("동영상을 재생합니다.");
            try{ Thread.sleep(1000); } catch(InterruptedException e){ }
        }
    }
}

 

11. while문으로 반복적인 작업을 하는 스레드를 종료시키는 방법에 대한 설명 중 최선의 방법이 아닌 것은?

① stop() 메소드를 호출해서 즉시 종료시킨다.

② 조건식에 boolean 타입의 stop 플래그를 이용해서 while문을 빠져나가게 한다.

③ 스레드가 반복적으로 일시 정지 상태가 된다면 InterruptedException을 발생시켜 예외 처리 코드에서 break문으로 while문을 빠져나가게 한다.

④ 스레드가 일시 정지 상태로 가지 않는다면 isInterrupted()나 interrupted() 메소드의 리턴값을 조사해서 true일 경우 break문으로 while문을 빠져나가게 한다.

 

☞ ① stop() 메소드를 호출해서 즉시 종료시킨다. 

stop() 메소드로 스레드를 갑자기 종료하게 되면 스레드가 사용 중이던 자원들이 불안전한 상태로 남겨지기 때문이다.