확인문제
- 스레드에 대한 설명 중 틀린 것은 무엇입니까?
- ① 자바 애플리케이션은 메인(main) 스레드가 main() 메소드를 실행시킨다.
- ② 작업 스레드 클래스는 Thread 클래스를 상속해서 만들 수 있다.
- ③ Runnable 객체는 스레드가 실행해야 할 코드를 가지고 있는 객체라고 볼 수 있다.
- ④ 스레드 실행을 시작하려면 run() 메소드를 호출해야 한다.
정답: ④ 해설: 스레드 실행을 시작하려면 start() 메소드를 호출해야 한다.
- 동영상과 음악을 재생하기 위해 두 가지 스레드를 실행하려고 합니다. 밑줄 친 부분에 적당한 코드를 작성해 보세요.
public class ThreadExample { public static void main(String[] args) { Thread thread1 = new MovieThread(); thread1.start(); Thread thread2 = new Thread(new MusicRunnable()); thread2.start(); } }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) { } } } }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) { } } } } - 동기화 메소드와 동기화 블록에 대한 설명 중 틀린 것은 무엇입니까?
- ① 동기화 메소드와 동기화 블록은 싱글(단일) 스레드 환경에서는 필요 없다.
- ② 스레드가 동기화 메소드를 실행할 때 다른 스레드는 일반 메소드를 호출할 수 없다.
- ③ 스레드가 동기화 메소드를 실행할 때 다른 스레드는 동기화 메소드를 호출할 수 없다.
- ④ 스레드가 동기화 블록을 실행할 때 다른 스레드는 동기화 메소드를 호출할 수 없다.
정답: ② 해설: 스레드가 동기화 메소드를 실행할 때 다른 스레드는 일반 메소드를 호출할 수 있다. 동기화된 메소드나 블록만 접근이 차단된다.
- 스레드 일시 정지 상태에 대한 설명 중 틀린 것은 무엇입니까?
- ① sleep() 메소드는 주어진 시간동안 스레드가 일시 정지 상태가 된다.
- ② 스레드가 동기화 메소드를 실행할 때 다른 스레드가 동기화 메소드를 호출하게 되면 일시 정지 상태가 된다.
- ③ 동기화 메소드 내에서 wait() 메소드를 호출하면 현재 스레드가 일시 정지 상태가 된다.
- ④ yield() 메소드를 호출하면 현재 스레드가 일시 정지 상태가 된다.
정답: ④ 해설: yield() 메소드를 호출하면 실행 대기 상태가 된다.
- interrupt() 메소드를 호출한 효과에 대한 설명 중 틀린 것은 무엇입니까?
- ① 일시 정지 상태에서 InterruptedException을 발생시킨다.
- ② 스레드를 즉시 종료한다.
- ③ 스레드가 일시 정지 상태가 될 때까지 InterruptedException이 발생하지 않는다.
- ④ InterruptedException이 발생하지 않았다면 isInterrupted() 메소드는 true를 리턴한다.
정답: ② 해설: interrupt() 메소드는 즉시 종료시키는 것이 아니라, 예외를 발생시키거나 인터럽트 상태를 설정하여 종료를 유도하는 것이다.
- 메인 스레드에서 3초 후 MovieThread의 interrupt() 메소드를 호출해서 MovieThread를 안전하게 종료하고 싶습니다. 비어있는 부분에 적당한 코드를 작성해 보세요.
public class MovieThread extends Thread { @Override public void run() { while(true) { System.out.println("동영상을 재생합니다."); if (this.isInterrupted()) { break; } } } }해설: 또는
try { Thread.sleep(1); } catch (InterruptedException e) { break; }도 가능하지만, 문제에서 “비어있는 부분에 적당한 코드”라고 했고 반복문 안이므로
if (Thread.interrupted()) break;혹은if (this.isInterrupted()) break;가 적절하다. OCR 결과에 따르면:/* Thread thread = new MovieThread(); thread.start(); try { Thread.sleep(3000); } catch (InterruptedException e) {} thread.interrupt(); */ public class MovieThread extends Thread { @Override public void run() { while(true) { System.out.println("동영상을 재생합니다."); if (isInterrupted()) { break; } } } } - wait()와 notify() 메소드에 대한 설명 중 틀린 것은 무엇입니까?
- ① 스레드가 wait()를 호출하면 일시 정지 상태가 된다.
- ② notify()를 호출하면 wait()로 일시 정지 상태에 있던 스레드가 실행 대기 상태가 된다.
- ③ wait()와 notify()는 동기화 메소드 또는 블록에서 호출할 필요가 없다.
- ④ wait()와 notify()는 두 스레드가 균등하게 번갈아 가면서 실행할 때 사용할 수 있다.
정답: ③ 해설: wait()와 notify()는 반드시 동기화 메소드 또는 동기화 블록 내에서 호출해야 한다.
- 3초 뒤에 메인 스레드가 종료하면 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) {} } } - while 문으로 반복적인 작업을 하는 스레드를 종료시키는 방법에 대한 설명 중 최선의 방법이 아닌 것은 무엇입니까?
- ① 조건식에 boolean 타입의 stop 플래그를 이용해서 while 문을 빠져나가게 한다.
- ② 스레드가 반복적으로 일시 정지 상태가 된다면 InterruptedException을 발생시켜 예외 처리 코드에서 break 문으로 while 문을 빠져나가게 한다.
- ③ 스레드가 일시 정지 상태로 가지 않는다면 isInterrupted()나 interrupted() 메소드의 리턴값을 조사해서 true일 경우 break 문으로 while 문을 빠져나가게 한다.
- ④ stop() 메소드를 호출한다.
정답: ④ 해설: stop() 메소드는 deprecated 되었으므로 사용하지 않는 것이 좋다.
- 스레드풀에 대한 설명 중 틀린 것은 무엇입니까?
- ① 갑작스러운 작업의 증가로 스레드의 폭증을 막기 위해 사용된다.
- ② ExecutorService 객체가 스레드풀이며 newFixedThreadPool() 메소드로 얻을 수 있다.
- ③ 작업은 Runnable 또는 Callable 인터페이스를 구현해서 정의한다.
- ④ execute() 메소드로 작업 처리 요청을 하면 작업이 완료될 때까지 대기(블로킹)된다.
정답: ④ 해설: execute() 메소드는 작업을 큐에 넣고 즉시 리턴한다(비동기). 블로킹되지 않는다.
서브목차