일반적으로 쓰레드는 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
'Java | spring > Java Basic' 카테고리의 다른 글
Java Stream, 파일 입출력의 기본 (0) | 2019.05.08 |
---|---|
Java 파일처리 기본 : 입출력, 스트림 (0) | 2019.05.08 |
Java, 동시 실행 스레드! Multi Thread 프로그래밍 (0) | 2019.05.08 |
Java RuntimeException, 자동 예외객체 생성 (0) | 2019.05.08 |
JAVA Exception 예외 처리 (0) | 2019.05.08 |
댓글