본문 바로가기
Java | spring/Java Basic

Thread 사이의 통신, 1:1 동작 멀티쓰레드

by 워니 wony 2019. 5. 8.

일반적으로 쓰레드는 2개 이상의 객체가 동시에 어떤 작업을 수행하도록 할 때 사용한다.

 

그렇기 때문에 지금까지 사용한 멀티 쓰레드 프로그램은 가능하면 2 이상의 객체가 동시에 어떤 작업을 수행하도록 했다.  그래서 반드시 1:1 동작하지는 않았다.

 

하지만 경우에 따라서는 1:1 동작하는 멀티 쓰레드를 용해야 하는 경우가 있다.

그런 경우에는 Thread 사이의 통신을 하면 된다.

자바의 제일 상위 클래스인 Object wait 메소드와 notify 메소드를 이용하면 구현이 가능하다.

 

  • wait( ) : 객체를 대기 시키기 위한 메소드
  • notify( ) : 대기중인 객체를 깨우기 위해 사용하는 메소드

 

 

1:1 멀티쓰레드 예제

- 생산자는 제품(정수) 만들고, 소비자는 해당 정수를 사용하는 프로그램 만들기

- 서로 통신을 하면서 정수가 만들어지고 나서 소비자가 사용할 수 있도록 구현

 

제품을 생산하는 클래스

package com.sun.test021.copy;

import java.util.Random;

public class Product {
	
	private int n;
	boolean isNew;
	
	public synchronized void makeNumber()
	{
		while(isNew == true)
		{
			try{
				wait();
			}catch (Exception e) {
				// TODO: handle exception
			}
		}
		
		Random rand = new Random();
	
		n = rand.nextInt(100)+1;
		System.out.println("new item==>"+n);
		isNew = true;
		notify();  //대기 중인 소비자를 깨운다.
	}
	
	public synchronized int getNumber() {
		
		while(isNew == false)
		{
			try { 
				wait();
			}catch (Exception e) {
				// TODO: handle exception
			}
		}
		
		System.out.println("Customer has a item==>"+n);
		isNew = false;
		notify();  //대기 중인 소비자를 깨운다.
		return n;
	}
}

 

생산자가 생산하는 클래스

package com.sun.test02;

public class Producer extends Thread{
	private Product product;
	
	public Producer(Product product)
	{
		super();
		this.product = product;
	}

	@Override
	public void run() {
		// TODO Auto-generated method stub
		
		for (int i = 1 ; i <=10 ; i++)
		{
			product.makeNumber();
			try {
				Thread.sleep(100);
			}catch (Exception e) {
				// TODO: handle exception
			}
		}
	}
}

 

소비자 소비하는 클래스

package com.sun.test02;

public class Cunsumer extends Thread {
	private Product product;

	public Cunsumer(Product product) {
		super();
		this.product = product;
	}

	@Override
	public void run() {
		// TODO Auto-generated method stub
		
		for(int i=1 ; i<=10 ; i++)
		{
			int n = product.getNumber();
			try {
				Thread.sleep(200);
			}catch (Exception e) {
				// TODO: handle exception
			}
		}
	}
}

 

메인 메소드 클래스

package com.sun.test02;

public class ProductTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		Product product = new Product();
		
		Producer producer = new Producer(product);
		Cunsumer cunsumer = new Cunsumer(product);
		
		producer.start();
		cunsumer.start();
	}
}

(결과값)

new item==>99

Customer has a item==>99

new item==>95

Customer has a item==>95

new item==>41

Customer has a item==>41

new item==>48

Customer has a item==>48

new item==>48

Customer has a item==>48

new item==>8

Customer has a item==>8

new item==>78

Customer has a item==>78

new item==>17

Customer has a item==>17

new item==>25

Customer has a item==>25

new item==>18

Customer has a item==>18

 

반응형

댓글