관련 이론 및 문법

(Thread 클래스 참고)

http://kkikkodev.tistory.com/141


(Runnable 인터페이스 참고)

http://kkikkodev.tistory.com/144


문제 의도

주어진 소스를 컴파일하여 실행한 결과를 고르는 문제입니다.


답안

E


풀이 방법

이 문제는, Thread 클래스의 join 메소드에 대한 문제입니다. 소스코드를 살펴보면, TestOne 이라는 클래스를 만들면서, Runnable 인터페이스를 상속하고 있습니다. 이에 따라서, 내부에 run 메소드를 overriding 하고 있고, 이 메소드에서는, for 문을 돌면서, i 를 0 부터 4 까지 1 씩 증가시키면서 변화시키면서 그 i 를 출력하고 있습니다.


main 메소드에서는, t.join() 메소드에서 발생할 수 있는, 예외처리를 회피하기 위해 throws Exception 을 추가하였습니다. (InterruptedException)


main 메소드가 실행되면, 먼저, t 라는 Thread 를 생성합니다. 생성자의 매개변수로 new TestOne() 객체를 넘겨줍니다. (Runnable 객체기 때문에 가능함) 그리고 t.start(); 문을 통해 쓰레드를 시작합니다. 그러면 이 시점에서, main 쓰레드 외에 t 쓰레드가 독자적으로, 실행을 하게 되고, run 메소드를 호출합니다.


main 쓰레드는 t 쓰레드의 흐름과 상관없이 그대로 밑으로 내려와서 "Started" 문자열을 출력하고, t.join(); 문을 실행하여, t 쓰레드가 run 메소드 작업을 마칠 때까지 다음줄을 (System.out.println("Completed");) 실행하지 않고, 대기합니다. t 쓰레드가 run 을 완료하여 "0123" 을 순서대로 화면에 출력하고 나면, t 쓰레드 또한 종료되고, 그제서야 main 쓰레드는 다음 줄을 실행하여 "Completed" 문자열을 출력합니다.


단, main 쓰레드의 출력문인 "Started" 와 t 쓰레드의 출력문인 "0123" 의 순서는 누가 먼저 출력될지는 보장되지 않습니다. "0123" 문자열 중간에 "Started" 문자열이 끼어서 출력이 될 수도 있는 것입니다. 단, 출력이 안되는 경우는 없습니다. 그래서, 보기 중에서, "Started", "0123", "Completed" 세 개의 문자열이 모두 출력되는 보기인 D 와 E 가 답안 후보가 됩니다.


t.join() 문 때문에, main 쓰레드는 t 가 끝나서야, 비로소 "Completed" 문자열을 출력하기 때문에, "Completed" 문자열은 무조건 나중에 출력된다는 것을 알 수 있습니다. 따라서, D 와 E 중에서 "Completed" 가 마지막에 출력된 보기인 E 가 답안이 됩니다.


by kkikkodev 2015. 8. 27. 14:36