1. 멀티스레딩과 멀티프로세싱 중에서 보다 진보된 방법은 무엇인가?
답 : 멀티스레딩
2. CPU가 하나인 경우 다음 중 멀티스레드로 작성하면 효과적이지 않은 것은? 그리고 그 이유를 말하여라.
1) 웹 서버.
2) 그리기와 프린팅 기능을 동시에 할 수 있는 그래픽 편집기
3) 1에서 100000까지 더하기를 2개의 스레드를 작성하여 한 스레드는 짝수만 더하고 다른 스레드는 홀수만 더하여, 최종적으로 두 합을 더하여 결과를 내는 응용프로그램
답 : 3번
이유 - 컴퓨터가 두 개의 스레드를 동시에 처리한다고 하더라도 하나의 CPU만 가진 경우 시간을 분할하여 두 개의 스레드를 돌아가면서 실행할 수 밖에 없다. 그러므로 실행하고자 하는 스레드가 입출력 작업이 많아 대기하는 시간이 많은 경우, 대기하는 시간 동안 다른 스레드가 CPU를 사용할 수 있도록 하면 멀티스레드 사용이 보다 효과적이다. 그러나 이 보기의 경우처럼 홀수만 합하는 스레드와 짝수만 합하는 두 개의 스레드가 실행되는 시간의 합은 1에서 100000까지 더하는 시간뿐만 아니라 스레의 문맥 교환에 따른 부가적인 시간이 소요되므로 하나의 스레드가 1에서 100000까지 더하는 경우 보다 소요 시간이 커지게 되어 오히려 비효율적이다.
3. 하나의 JVM이 여러 개의 자바 응용프로그램을 실행할 수 있는가?
답 : x
4. 하나의 JVM이 여러 개의 자바 스레드를 실행할 수 있는가?
답 : o
5. 자바 스레드에 있어 스레드의 실행 및 스케줄링을 책임지는 것은 개발자인가 JVM인가?
답 : JVM
6. Thread를 상속받아 자바 스레드를 작성하는 경우 반드시 오버라이딩 해야 하는 메소드는?
답 : public void run() 메소드
7. 자바 스레드가 sleep()하는 동안 발생하는 예외에 대비하여 try-catch 블록을 만들어야 하는데 이 예외는 무엇인가?
답 : InterruptedException
8. 실행 시작 10초 후에 자동으로 종료하는 스레드를 Thread 클래스를 이용하여 작성하라.
public class ExitAfter10MinApp {
publi static void main(String[] args) {
TenSecondThread th = new TenSecondThread();
th.start();
}
}
class TenSecondThread extends Thread {
public void run() {
System.out.println("스레드가 시작됩니다.");
try {
Thread.sleep(10000);
}
catch(InterruptedException e) {}
System.out.println("스레드 종료합니다.");
}
}
9. 실행 시작 10초 후에 자동으로 종료하는 스레드를 Runnable 인터페이스를 이용하여 작성하라.
public class ExitAfter10MinApp2 {
publi static void main(String[] args) {
Thread th = new Thread(new TenSecondRunnable());
th.start();
}
}
class TenSecondRunnable extends Runnable {
public void run() {
System.out.println("스레드가 시작됩니다.");
try {
Thread.sleep(10000);
}
catch(InterruptedException e) {}
System.out.println("스레드 종료합니다.");
}
}
10. System.out.println("hello"); 문장을 실행하는 동안 발생하는 스레드의 상태 변화에 대해 설명하라.
답 : 화면에 출력하는 것은 입출력 행위이므로 자바의 경우 입출력이 발생하면 입출력을 수행하는 스레드는 BLOCK상태가 된다. 그리고 입출력이 모두 종료하면 RUNNABLE 상태로 돌아오며 자바 가상 기계에 의해 스케줄링되면 다시 실행된다.
11. 자바에서 스레드가 다른 스레드에게 실행을 양보하기 위해 호출하는 메소드는 무엇인가?
답 : yield() 메소드
12. 자바에서 스케줄링 우선순위의 범위는?
답 : 1에서 10 사이
13. 자바에서 가장 높은 우선순위의 스레드가 종료할 때까지 낮은 우선순위의 스레드는 더 이상 실행할 수 없는가?
답 : 0
14. 자바 응용프로그램에서 스레드의 우선순위를 조절할 수 있는가?
답 : 0
15. 한 번 종료한 스레드의 Thread 객체를 통해 스레드를 다시 생성할 수 있는가?
답 : x
16. Thread 클래스의 run() 메소드에서 return 문은 어떤 역할을 하는가?
답 : Thread 클래스의 run() 메소드에서 return 문은 스레드를 종료시키는 결과를 낳는다.
17. 스레드 동기화는 어떤 경우에 필요한가?
1) 멀티스레드가 공유 데이터에 접근할 때 2) 스레드의 우선순위를 높일 때
3) 스레드가 종료하는 시간을 맞출 때 4) 스레드를 타이머처럼 작동시킬 때
답 : 1번
18. 자바에서 2개 이상의 스레드가 동시에 실행할 가능성이 있는 코드 블록에, 스레드가 하나씩 순차적으로 실행되도록 지시하는 키워드는 무엇인가?
답 : synchronized
19. wait(), notify(), notifyAll() 메소드는 어떤 클래스의 멤버인가?
답 : Object의 멤버이다. 그러므로 모든 자바 객체들이 이 메소드를 가지고 있다
20. wait(), notify(), notifyAll()의 목적은 무엇인가?
답 : 멀티스레드의 동기화이다. wati() 메소드는 객체를 현재 사용 중인 스레드가 깨워주기를 기다리면서 대기하게 하며, notify()는 객체를 기다리는 스레드 중 하나만 깨우고, notifyAll()은 모든 스레드를 깨운다.
21. 모든 객체가 동기화 객체로 사용될 수 있는가?
답 : 모든 객체는 Object를 상속받으므로 모든 객체가 wait(), notify(), notifyAll() 메소드를 가지고 있다. 그러므로 모든 객체가 동기화 객체로 사용될 수 있다.