티스토리 뷰

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) 소비자에게 알린다. 가져가~~
	}
}
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2026/03   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함