본문 바로가기

프로그래밍 언어/Java

[Java] 멀티스레드 프로그래밍 - 스레드간의 커뮤니케이션

반응형

 

두 스레드가 데이터를 교환하는 기본적인 방법

 

공유 영역 생성
class SharedArea { //공유 영역을 표현하는 클래스
             double result; 공유 데이터를 저장할 필드
}

공유 영역을 만들 때에는 래퍼런스 타입으로 선언해야 여러 스레드가 참조값을 가지고 접근할 수 있다.

 

데이터 교환 타이밍 맞추기

가장 간단한 방법은 공유 영역 안에 데이터 유무를 표시하는 필드를 추가하는 것

class SharedArea {
             double result;
             boolean isReady; // 공유 데이터가 쓰여졌는지 여부를 표현하는 필드
}

 

원주율 파이를 계산해서 출력하는 멀티스레드 프로그램
class MultithreadExample4 { // main 메소드를 포함하는 클래스 
	public static void main(String args[]) {
		CalcThread thread1 = new CalcThread();
		PrintThread thread2 = new PrintThread();
		SharedArea obj = new SharedArea();
		thread1.sharedArea = obj;
		thread2.sharedArea = obj;
		thread1.start();
		thread2.start();
	}
}

class SharedArea { // 공유 영역 스레드 
	double result;
	boolean isReady; // 공유 데이터가 쓰여졌는데 여부를 표현하는 필드 (default - false)
}

class CalcThread extends Thread { // 파이를 계산하는 스레드 클래스
	SharedArea sharedArea;

	public void run() {
		double total = 0.0;
		for (int cnt = 1; cnt < 1000000000; cnt += 2)
			if (cnt / 2 % 2 == 0)
				total += 1.0 / cnt;
			else
				total -= 1.0 / cnt;
		sharedArea.result = total * 4;
		sharedArea.isReady = true; // SharedArea 객체의 isReady 필드값을 true로 설정 
	}
}

class PrintThread extends Thread { // 파이를 출력하는 스레드 클래스
	SharedArea sharedArea;

	public void run() {
		while (sharedArea.isReady != true) // SharedArea 객체의 isReady 필드 값이 true가 될 때까지 루프를 반복 
			continue;		
            System.out.println(sharedArea.result);
	}
}

 

그러나, SharedArea 객체의 isReady 필드 값이 true가 될 때까지 루프를 continue하는 것은 좋은 방법은 아니다.

CPU 계속 사용하면서 기다리기 때문 (busy waiting) -> wait ~ notify 메소드 사용하는 것이 바람직하다. 

반응형