T14_ThreadShareDataTest
public class T14_ThreadShareDataTest {
public static void main(String[] args) {
//공통으로 사용할 객체의 인스턴스 생성
ShareData sd = new ShareData();
//처리할 쓰레드 객체 생성
CalcPIThread cpt = new CalcPIThread(sd);
PrintPIThread ppt = new PrintPIThread(sd);
cpt.start();
ppt.start();
}
}
원주율을 관리하는 클래스(공통으로 사용할 클래스)
class ShareData {
public double result; // 원주율이 저장될 변수.
//원주율 계산이 완료되었는지를 나타내는 변수
volatile public boolean isOk = false;
}
원주율을 계산하는 쓰레드
class CalcPIThread extends Thread{
private ShareData sd;
public CalcPIThread(ShareData sd) {
this.sd = sd;
}
@Override
public void run() {
/**
* 원주율 = (1/1 - 1/3 + 1/5 - 1/7 + 1/9.....) *4; -> *4를 해줘야 파이값
* 1 + 3 + 5 - 7 + 9 => 분모
* 0 1 2 3 4 => 2로 나눈 몫
*/
double sum = 0.0;
for (int i = 1; i < 1500000000; i+=2) {
if((i/2) % 2 == 0) { //2로 나눈 몫이 짝수이면 +
sum += (1.0/i);
}else {//2로 나눈 몫이 홀수이면 -
sum -= (1.0/i);
}
}
sd.result = sum * 4; //계산된 원주율을 공통객체의 멤버변수에 저장
sd.isOk = true; //계산이 완료되었음을 나타냄
}//run
}//class
계산된 원주율을 출력하는 쓰레드
class PrintPIThread extends Thread {
private ShareData sd;
public PrintPIThread(ShareData sd) {
this.sd = sd;
}
@Override
public void run() {
while (true) {
// 원주율 계산이 완료될 때까지 기다린다.
if (sd.isOk) {
break;
}
}
System.out.println();
System.out.println("계산된 원주율 : " + sd.result);
System.out.println(" PI : " + Math.PI);
}// run
}// class