본문 바로가기

Java

자바 스레드 (Thread) 연습문제 2

자바 스레드 (Thread) 연습문제 1과 같은 문제이지만,

synchronizedwait(), notify()를 이용한 더 어려운 방법입니다.

 

notify()와 wait()는 쉽게 말해서 티키타카를 한다고 생각하시면 됩니다.

 

notify()를 통해 wait() 상태인 스레드를 깨워줍니다.

 

- notify()notifyAll() 메소드는 synchronized 메소드를 수행하기 위해 기다리는 대기 상태의 스레드를 깨워줍니다. notify()는 대기 중인 스레드가 여러 개일 경우 그중에 하나의 스레드만을 깨운다.

notifyAll() 메소드는 대기 중인 모든 스레드를 깨우는 것을 제외하고는 notify()와 같다.

 

package Twentysix;

import java.util.Random;

class Work
{
	int p1=0;
	int p2=0;
	
	Random r = new Random();
	
	synchronized void person1Work() // person1 스레드가 work 객체의 person1Work() 메소드 호출
	{
		p1 += r.nextInt(20)+1;
		System.out.println("사람1 실행");
		notify(); // 사람2 깨움
		
		try
		{
			wait(); // 그리고 사람1은 잔다
		}
		catch (InterruptedException e) // 예외처리
		{
			// TODO: handle exception 
		}
	}
	
	synchronized void person2Work() // person2 스레드가 work 객체의 person2Work() 메소드 호출
	{
		p2 += r.nextInt(20)+1;
		System.out.println("사람2 실행");
		notify(); // 사람1 깨움
		
		try
		{
			wait(); // 그리고 사람2는 잔다
		}
		catch (InterruptedException e) // 예외처리
		{
			 // TODO: handle exception
		}
	}
	synchronized void person2wake()
		{
			notify();
		}
}

class person1Thread extends Thread
{
	Work w;
	
	public person1Thread(Work w)
	{
		this.w = w;
	}
	
	public void run()
	{
		for (int i = 0; i < 100; i++) 
		{
			w.person1Work();
		}
		
		System.out.println("1번 사람의 총 값: " + w.p1);
		w.person2wake();
	}
}

class person2Thread extends Thread
{
	Work w;
	
	public person2Thread(Work w)
	{
		this.w = w;
	}
	
	public void run()
	{
		for (int i = 0; i < 100; i++) 
		{
			w.person2Work();
		}
		
		System.out.println("2번 사람의 총 값: " + w.p2);
		
	}
}

public class Threadpracticealone {

	public static void main(String[] args) throws InterruptedException {
		// TODO Auto-generated method stub

		Work w = new Work();
		
		person1Thread p1 = new person1Thread(w);
		person2Thread p2 = new person2Thread(w);
		
		p1.start();
		p2.start();
		
		p1.join();
		p2.join();
		
		if(w.p1>w.p2)
		{
			System.out.println("사람1 승리");
		}
		else if(w.p1<w.p2)
		{
			System.out.println("사람2 승리");
		}
		else
		{
			System.out.println("비겼습니다.");
		}
		
	}

}

 

콘솔에 나타나는 결과값: