티스토리 뷰

Chapter 12. 스레드

 

▶ 학습 목표

: 스레드가 무엇인지 설명할 수 있고 스레드를 생성하고 구현할 수 있다.

 

 

 

 

 

 

12-6. wait()과 notify()

 

: 스레드가 작동하고 있을 때 스레드를 대기 시키거나 대기 중인 스레드를 깨우는 메서드이다.

이것을 통해 스레드를 제어할 수 있다.

 

 

스레드 동기화(synchronized)를 통해 객체의 락(=잠금=lock)을 한 스레드의 작업이 완료될 때까지 제공하여 공유하는 데이터를 보호한다. 하지만 특정 조건 때문에 완료되지 못하는 상태라면 계속해서 락을 반납하지 못하는 경우가 발생한다.

이러한 문제점을 제어하는 것이 대기시키는 메서드인 wait()과 대기 중인 메서드를 깨우는 notify() 메서드이다.

 

wait()는 스레드가 락을 반납하고 지정된 시간만큼 기다리게 한다.

만약 지정된 배개변수가 없을 경우 notify()가 호출되어야 깨어난다.

notify()는 스레드가 다시 락을 얻을 수 있도록 대기 중인 스레드를 모두 깨운다. 

 

 

 

 

 

package chapter11;
class Account
{
	int money=0;
	
	public int showMoney() 
	{
		return money;
		
	}
	public synchronized void setMoney() 
	{
		try 
		{
			Thread.sleep(1000);
		} 
		
		catch (InterruptedException ie) 
		{
			System.out.println(ie.toString());
		}
		
		this.money+=2000;
		
		System.out.println("어머니가 용돈을 입금했습니다. 현재 잔액 "+this.showMoney());
		this.notify();
	}
	
	public synchronized void getMoney() 
	{
		while(money<=0)
		{
			System.out.println("통장 잔고가 없어서 아들 대기 중");
			
			try 
			{
				this.wait();
			} 
			catch (InterruptedException e) 
			{
				
			}
			
			this.money-=2000;
			System.out.println("아들이 용돈을 출금했습니다. 현재 잔액"+this.showMoney());
		}
	}
}	
	class Son extends Thread
	{
		private Account account;
		
		Son(Account account)
		{
			this.account=account;
		}
		
		public void run() {
			for(int i=0; i<10; i++) {
				account.getMoney();
			}
		}
	}
	class Mom extends Thread
	{
		private Account account;
		Mom(Account account){
			this.account=account;
		}
		public void run() {
			for(int i=0; i<10; i++) {
				account.setMoney();
			}
		}
	}


public class Money {

	public static void main(String[] args) {
		Account account = new Account();
		Son son = new Son(account);
		Mom mom = new Mom(account);
		son.start();
		mom.start();

	}

}

 

 

통장 잔고가 없어서 아들 대기 중
어머니가 용돈을 입금했습니다. 현재 잔액 2000
어머니가 용돈을 입금했습니다. 현재 잔액 4000
어머니가 용돈을 입금했습니다. 현재 잔액 6000
어머니가 용돈을 입금했습니다. 현재 잔액 8000
어머니가 용돈을 입금했습니다. 현재 잔액 10000
어머니가 용돈을 입금했습니다. 현재 잔액 12000
어머니가 용돈을 입금했습니다. 현재 잔액 14000
어머니가 용돈을 입금했습니다. 현재 잔액 16000
어머니가 용돈을 입금했습니다. 현재 잔액 18000
어머니가 용돈을 입금했습니다. 현재 잔액 20000
아들이 용돈을 출금했습니다. 현재 잔액18000

 

getmoney() setmoney()메서드를 10번씩 반복한다.

 

 

 

 

 

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday