2012년 10월 8일 월요일

OCJP 문제풀이 - Question 4


QUESTION 4
Click the Exhibit button.
What is the output if the main() method is run?

public class Starter extends Thread {
  private int x = 2;
  public static void main(String[] args) throws Exception {
    new Starter().makeItSo();
  }
 
  public Starter(){
    x = 5;
    start();
  }

  public void makeItSo() throws Exception {
    join();
    x = x - 1;
    System.out.println(x);
  }
  public void run() { x *= 2; }
}

A. 4
B. 5
C. 8
D. 9
E. Compilation fails.
F. An exception is thrown at runtime.
G. It is impossible to determine for certain.

Answer: D
Section: All

Explanation/Reference:

1> 먼저 main 메소드의 내용이 실행된다

2> 메인 메소드에서 Starter 객체를 생성했기때문에 먼저 Starter() 생성자가 실행되어
x 변수에는 5가 들어가고 start() 메소드를 실행한다.

3> Starter 객체는 Thread를 상속받았기때문에 start() 메소드는 새로운 Thread 내에서 Starter 객체의 run() 메소드를 실행하게 된다. start() 메소드를 실행한 직후에 기존 Thread에서는 makeItSo() 메소드를 실행한다.(즉 run() 과 makeItSo() 는 서로다른 Thread에서 실행되고 어느것이 먼저 실행될지는 알 수없다.)

4 - 1> makeItSo() 가 실행되면 join() 함수가 실행되는 데, 이 조인함수는 대상 Thread가 종료될때까지 기다리는 함수이다. 여기서 join의 대상은 최초에 생성한 Thread이기 때문에 기존 Thread가 종료될때까지 makeItSo() 메소드 실행은 멈춰있게된다.

4 - 2> start() 함수로 새로운 쓰레드에서 run() 함수가 실행되어 x의 값이 두배가 된다.
(현재 x의 값은 5 * 2 = 10)

* 4-1 과 4-2 는 어떤것이 먼저 실행될지 알 수없다.

5 > run() 함수가 종료되면 join() 으로 인해 멈췄던 기존 쓰레드가 실행되며, x에서 1를 빼고 x를 출력한다.


결과 > 9


블로그 보관함