반응형
두 스레드가 데이터를 교환하는 기본적인 방법
공유 영역 생성
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 메소드 사용하는 것이 바람직하다.
반응형
'프로그래밍 언어 > Java' 카테고리의 다른 글
JPA란? JPA를 사용해야 하는 이유 (0) | 2020.01.16 |
---|---|
JDBC - Unknown column in 'where clause' 에러 해결 (0) | 2019.11.27 |
[Java] 멀티스레드 프로그래밍 - Runnable 인터페이스 (0) | 2019.10.28 |
[Java] 멀티스레드 프로그래밍 - Thread 클래스 (0) | 2019.10.28 |
[Java] GUI 프로그래밍 (0) | 2019.09.29 |