티스토리 뷰
Q1. 쓰레드 만드는 방법 2가지에 대한 코드이다. 빈칸을 채우시오.
public class MyThread ___________________________//(1){
public void run() {
System.out.println("Thread1 - 상속 방법");
}
public class MyRunnable _______________________//(2){
public void run(){
System.out.println("Thread 2 - 구현 방법");
}
public class Main{
public static void main(String[] args){
___________t1 =___________________//(3) MyThread 객체 생성
_________________________//(4) 쓰레드 실행
___________t2 =____________________//(5) MyRunnable 객체 생성
_________________________//(6) 쓰레드 실행
A1.
(1) extends Thread
(2) implements Runnable
(3) Thread t1 = new MyThread();
(4) t1.start();
(5) Thread t2 = new Thread(new MyRunnable());
(6) t2.start();
Q2. 다음의 코드를 보고 "공주:" 출력문이 콘솔에 출력될지, 아니면 오류가 날지 생각해보고, 난다면 그 이유가 무엇인지 쓰시오.
public class Princess extends Thread {
Object lock;
public Princess(Object lock) {
this.lock = lock;
}
public void run() {
try {
System.out.println("공주: 잠자고 있는 중...zzz");
wait();
System.out.println("공주: 왕자의 키스로 깨어났어요!");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
------------------------------
package 랩8_잠숲공_wait_notify;
public class SleepingBeauty {
public static void main(String[] args) {
Object lock = new Object();
Princess 공주 = new Princess(lock);
Prince 왕자 = new Prince(lock);
공주.start();
왕자.start();
}
}
A2. 출력되지 않는다.(오류가 난다.) synchronized 블록 안에서만 lock.wait()을 쓸 수 있기 때문이다. 하지만 현재 코드에는 synchronized 블록이 없으므로 오류이다.
Q3. wait(), sleep(), join()의 차이
짱구는 잠을 자면 무조건 1분 뒤에 혼자서도 잘 일어나고, 짱아는 엄마가 깨워줘야만 일어난다. 그리고 흰둥이는 짱구의 행동을 보며 기다리다가 짱구가 멈추면 따라한다. 각각의 비유에 맞는 함수를 매칭하시오.
짱구 -
짱아 -
흰둥이 -
A3.
짱구 - sleep()
짱아 - wait()
흰둥이 - join()
Q4. 생산자-소비자 관계 5단계를 설명해 보시오. 이후 아래 코드가 돌아가도록 완성시켜 보시오.
//생산자 소비자 5단계
//1._____________________
//2._____________________
//3._____________________
//4._____________________
//5._____________________
public class CoordinationTest {
public static void main(String[] args) {
Buffer buffer = new Buffer();
Producer 생산자 = new Producer(buffer);
Consumer 소비자 = new Consumer(buffer);
//생산자.start();
소비자.start();
생산자.start();
}
}
//생산자 class
public class Producer extends Thread{
Buffer buffer;
private int data;
public Producer(Buffer b) {
buffer = b;
}
public void run() {
for(int i=0; i<10; i++) {
data = i;
System.out.println("생산자: "+data+"번 케익을 생산하였습니다.");
buffer._______;//(1)
try {
Thread.sleep((int)(Math.random()*100));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
//소비자 class
public class Consumer extends Thread{
Buffer buffer;
private int data;
public Consumer(Buffer b) {
buffer = b;
}
public void run() {
for(int i=0; i<10; i++) {
data = buffer.______;//(2)
System.out.println("소비자: "+data+"번 케익을 소비하였습니다.");
try {
Thread.sleep((int)(Math.random()*100));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
//버퍼 class
public class Buffer {
private int data;
private boolean empty = ________;//(3)
public synchronized int get() {
while(__(4)__) {
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
_________________//(5)
_________________//(6)
return data;
}
public synchronized void put(int d) {
while(___(7)___) {
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
___________________//(8)
data = d;
_____________________//(9)
}
}
A4.
1. 소비자 쓰레드 wait() //생산자가 뭘 넣을 때까지 기다린다.
2. 생산자 쓰레드 데이터 저장 //빵 만들어서 넣어준다.
3. 생산자 쓰레드 소비자에게 알림 소비자쓰레드.notify() //빵 넣어놨어~
4. 생산자 쓰레드 wait() //소비자가 꺼내가도록 기다린다.
5. 소비자 쓰레드 데이터 읽기 //가져간다.
public class CoordinationTest {
public static void main(String[] args) {
Buffer buffer = new Buffer();
Producer 생산자 = new Producer(buffer);
Consumer 소비자 = new Consumer(buffer);
//생산자.start();
소비자.start();
생산자.start();
}
}
//생산자 class
public class Producer extends Thread{
Buffer buffer;
private int data;
public Producer(Buffer b) {
buffer = b;
}
public void run() {
for(int i=0; i<10; i++) {
data = i;
System.out.println("생산자: "+data+"번 케익을 생산하였습니다.");
buffer.put(data);//(1)생산자는 data를 집어넣는다.
try {
Thread.sleep((int)(Math.random()*100));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
//소비자 class
public class Consumer extends Thread{
Buffer buffer;
private int data;
public Consumer(Buffer b) {
buffer = b;
}
public void run() {
for(int i=0; i<10; i++) {
data = buffer.get();//(2)소비자는 data를 get()한다.
System.out.println("소비자: "+data+"번 케익을 소비하였습니다.");
try {
Thread.sleep((int)(Math.random()*100));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
//버퍼 class
public class Buffer {
private int data;
private boolean empty = true;//(3) 처음엔 비어있음
public synchronized int get() {
while(empty) {//(4) 버퍼가 비어있으면 empty==true 대기
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
empty=true;//(5) 데이터를 꺼냈으므로 비어 있음 상태로 변경
notifyAll();//(6) 꺼내갔으니 생산자에게 알린다
return data;
}
public synchronized void put(int d) {
while(!empty) {//(7) 버퍼가 차 있으면 !empty 생산자 대기
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
empty = false;//(8) 데이터를 넣었으므로 차 있음 상태로 변경
data = d;//데이터 집어넣고
notifyAll();//(9) 소비자에게 알린다. 가져가~~
}
}'학교 강의 > Java프로그래밍및실습2' 카테고리의 다른 글
| [SOLID원칙] 문제 만들기 (0) | 2025.10.04 |
|---|---|
| [SOLID 원칙] 커피메이커.ver1 코드 이해하기 - SOLID 원칙 적용 (2) | 2025.10.01 |
| [Thread] JAVA에서의 Thread (0) | 2025.09.25 |
| 제네릭과 컬렉션 5 문제 만들기 (0) | 2025.09.20 |
| 배틀 리팩토링 - 모듈화를 중심으로 (2) | 2025.09.13 |
