1. 스레드에 대한 설명 중 틀린 것은 무엇입니까?
1) 자바 애플리케이션은 메인(main) 스레드가 main() 메소드를 실행시킨다.
2) 작업 스레드 클래스는 Thread 클래스를 상속해서 만들 수 있다.
3) Runnable 객체는 스레드가 실행해야 할 코드를 가지고 있는 객체라고 볼 수 있다.
4) 스레드의 실행을 시작하려면 run() 메소드를 호출해야 한다.
정답 : 4
스레드의 실행을 시작하려면 start() 메소드를 호출해야 한다.
2. 동영상과 음악을 재생하기 위해 두 가지 스레드를 실행하려고 합니다. 비어 있는 부분에 적당한 코드를 넣어보세요.
[ThreadExample.java]
1
2
3
4
5
6
7
8
9
10
|
public class ThreadExample {
public static void main(String[] args) {
Thread thread1 = new MovieThread();
thread1.start();
Thread thread2 = new Thread(new MusicRunnalbe());
thread2.start();
}
}
|
cs |
[MovieThread.java]
1
2
3
4
5
6
7
8
9
10
11
12
|
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) {
}
}
}
|
cs |
[MusicRunnable.java]
1
2
3
4
5
6
7
8
9
10
11
12
|
public class MusicRunnalbe implement Runnalbe{
@Override
public void run() {
for (int i = 0 ; i < 3;i++) {
System.out.println("음악을 재생합니다.");
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
}
}
|
cs |
3. 스레드의 우선순위에 대한 설명 중 틀린 것은 무엇입니까?
1) 우선순위가 높은 스레드가 실행 기회를 더 많이 가질 수 있다.
2) 우선순위는 1부터 10까지 줄 수 있는데, 디폴트는 5이다.
3) Thread 클래스는 NORM_PRIORITY, MIN_PRIORITY, MAX_PRIORITY 상수를 제공한다.
4) 1은 가장 높은 우선순위이기 때문에 다른 스레드보다 실행 기회를 더 많이 갖는다.
정답 : 4
1은 가장 낮은 우선순위이다.
4. 동기화 메소드와 동기화 블록에 대한 설명 중 틀린 것은 무엇입니까?
1) 동기화 메소드와 동기화 블록은 싱글(단일) 스레드 환경에서는 필요없다.
2) 스레드가 동기화 메소드를 실행할 때 다른 스레드는 일반 메소드를 호출할 수 없다.
3) 스레드가 동기화 메소드를 실행할 때 다른 스레드는 다른 동기화 메소드를 호출할 수 없다.
4) 스레드가 동기화 블록을 실행할 때 다른 스레드는 다른 동기화 메소드를 호출할 수 없다.
정답 : 2
스레드가 동기화 메소드나 동기화 블록을 실행하면 동기화가 설정된 모든 메소드나 블록을 다른 스레드가
사용할 수 없게 된다.
5. 스레드의 일시 정지 상태에 대한 설명 중 틀린 것은 무엇입니까?
1) 일시 정지 상태는 BLOCKED, WAITING, TIMED_WAITING이 있다.
2) 스레드가 동기화 메소드를 실행할 때 다른 스레드가 동기화 메소드를 호출하게 되면 BLOCKED 일시정지
상태가 된다.
3) 동기화 메소드 내에서 wait()를 호출하면 WAITING 일시정지 상태가 된다.
4) yield() 메소드를 호출하면 TIMED_WAITNG 일시 정지 상태가 된다.
정답 : 4
yield() 메소드를 호출한 스레드는 실행 대기상태로 돌아가고 동일한 우선순위 또는 높은 우선순위를 갖는 다른
스레드가 실행 기회를 가질 수 있도록 해준다.
6. 스레드 상태 제어를 하는 메소드에 대한 설명 중 틀린 것은 무엇입니까?
1) yield() 메소드를 호출한 스레드는 동일한 우선순위나 높은 우선순위의 스레드에게 실행 기회를 양보하고 자신은
실행대기 상태가 된다.
2) sleep() 메소드를 호출한 스레드는 주어진 시간 동안 일시 정지 상태가 된다.
3) stop() 메소드는 스레드를 즉시 종료시키기 때문에 스레드 안정성에 좋지 못하다.
4) join() 메소드를 호출한 스레드가 종료할 때까지 join() 메소드를 멤버로 가지는 스레드는 일시 정지 상태가 된다.
정답 : 4
join()메소드를 멤버로 가지는 스레드가 종료할 때까지 join() 메소드를 호출한 스레드가 일시 정지 상태가 된다.
7. interrupt() 메소드를 호출한 효과에 대한 설명 중 틀린 것은 무엇입니까?
1) 일시 정지 상태에서 InterruptedException을 발생시킨다.
2) 스레드는 즉시 종료된다.
3) 실행 대기 상태에서 호출되면 일시 정지 상태가 될 때까지 InterruptedException이 발생하지 않는다.
4) 아직 InterruptedException이 발생하지 않았다면 interrupted(), isInterrupted() 메소드는 true를 리턴한다.
정답 : 2
스레드를 즉시 종료시키는건 stop() 메소드이다.
8. 메인 스레드에서 1초 후 MovieThread의 interrupt() 메소드를 호출해서 MovieTread를 안전하게 종료하고 싶습니다.
비어 있는 부분에 적당한 코드를 작성해보세요.
[ThreadExample.java]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
public class ThreadExample {
public static void main(String[] args) {
Thread thread = new MovieThread();
thread.start();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
thread.interrupt();
}
}
|
cs |
[MovieThread.java]
1
2
3
4
5
6
7
8
9
10
11
|
public class MovieThread extends Thread {
@Override
public void run() {
for (int i = 0 ; i < 3; i++) {
System.out.println("동영상을 재생합니다.");
if (Thread.interrupted()) {
break;
}
}
}
}
|
cs |
interrupt() 메소드를 실행시 스레드가 실행 대기 상태라면 interruptedException을 발생시키지 않는다.
그래서 위와 같이 Thread.interrupted() 메소드 (interrupt()드가 실행되었는지 여부)를 실행시켜 true일때
break; 를 하면 된다.
혹은 실행 대기상태를 잠깐 일시 정지 상태로 바꿔 interruptedException을 발생시키는 방법도 있다.
1
2
3
4
5
6
7
8
|
for (int i = 0 ; i < 3; i++) {
System.out.println("동영상을 재생합니다.");
try {
Thread.sleep(1);
} catch (InterruptedException e) {
break;
}
}
|
cs |
sleep(1)로 일시 정지상태로 잠깐 바꿔서 메인 스레드에서 실행된 interrupt() 메소드에 의해
InterruptedException이 발생
9. wait() 와 notify() 메소드에 대한 설명 중 틀린 것은 무엇입니까?
1) 스레드가 wait()를 호출하면 일시 정지 상태가 된다.
2) 스레드가 notify()를 호출하면 wait()로 일시 정지 상태에 있던 다른 스레드가 실행 대기 상태가 된다.
3) wait()와 notify()는 동기화 메소드 또는 블록에서 호출할 필요가 없다.
4) 스레드가 wait(long mills)를 호출하면 notify()가 호출하지 않아도 주어진 시간이 지나면 자동으로 실행
대기 상태가 된다.
정답 : 3
wait()와 notify()메소드는 반드시 동기화 블록 , 동기화 메소드 안에서 실행되어야 한다.
10. 메인 스레드가 종료하면 MovieThread도 같이 종료되게 만들고 싶습니다. 비어 있는 부분에 적당한 코드를 넣어보세요.
[ThreadExample.java]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
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) {
}
}
}
|
cs |
thread.setDaemon(true); 를 통해 MovieThread를 데몬스레드로 만든다.
(데몬스레드의 특징 : 메인스레드가 종료되면 자동으로 같이 종료된다.)
11. while문으로 반복적인 작업을 하는 스레드를 종료시키는 방법에 대한 설명 중 최선의 방법이 아닌것은?
1) stop() 메소드를 호출해서 즉시 종료시킨다.
2) 조건식에 boolean 타입의 stop 플래그를 이용해서 while문을 빠져나가게 한다.
3) 스레드가 반복적으로 일시 정지 상태가 된다면 InterruptedException을 발생시켜 예외 처리 코드에서 break문
으로 while문을 빠져나가게 한다.
4) 스레드가 일시 정지 상태로 가지 않는다면 isInterrupted()나 interrupted() 메소드의 리턴값을 조사해서 true일
경우 break문으로 while문을 빠져나가게 한다.
정답 : 1
12. 스레드풀에 대한 설명 중 틀린 것은 무엇입니까?
1) 갑작스러운 작업의 증가로 스레드의 폭증을 막기 위해 사용한다.
2) ExecutorService 객체가 스레드풀이며 newFixedThreadPool() 메소드로 얻을 수 있다.
3) 작업은 Runnable 또는 Callable 인터페이스를 구현해서 정의한다.
4) submit() 메소드로 작업 처리 요청을 하면 작업이 완료될 때까지 블로킹한다.
정답 : 4
submit() 자체가 블로킹하진 않고, submit()이 반환하는 리턴 객체 Future의 get()메소드가 호출되면 작업이 완료
될 때까지 블로킹된다.
13. Future 객체에 대한 설명 중 틀린 것은 무엇입니까?
1) Future는 스레드가 처리한 작업의 결과값을 가지고 있는 객체이다.
2) submit() 메소드를 호출하면 즉시 리턴되는 객체이다.
3) Future get() 메소드는 스레드가 작업을 완료하기 전까지 블로킹된다.
4) CompletionService를 이용하면 작업 완료된 순으로 Future를 얻을 수 있다.
정답 : 1
Future 자체는 결과값을 가지고 있는 객체가 아니다. Future는 지연완료 객체로써 스레드가 작업완료하기를 기다렸다
가 작업완료시 그 결과값을 가져오는 역할을 한다.
'IT > 연습문제' 카테고리의 다른 글
이것이 자바다 15장 연습문제 : 컬렉션 프레임워크 (0) | 2020.09.23 |
---|---|
이것이 자바다 13장 연습문제 : 제네릭 (0) | 2020.09.21 |
이것이 자바다 11장 연습문제 : 기본API 클래스 (0) | 2020.09.17 |
자바 연습문제 : 예외처리(try~catch) (0) | 2020.09.12 |
자바 연습문제 : 인터페이스와 구현 클래스 작성 (0) | 2020.09.09 |