원주율을 구하여 출력하는 멀티스레드 예제

class CalcThread extends Thread 

{

SharedArea sharedArea;//이걸 선언해서 공유 영역에 접근하도록 한다. 클래스형 변수(객체)선언

public void run()

{

double total = 0.0;

for(int i=1; i<1000000000; i+=2){

if(i/2 % 2 ==0) total +=1.0/i;

else total -=1.0/i;

}

sharedArea.result = total*4; //원주율(3.14를 공유영역에 넣음)

sharedArea.isReady = true;

}

}

//--------------------------------------------------------------------------------------------------
class SharedArea 
{
double result;
boolean isReady; //new Challenger!!
}
//--------------------------------------------------------------------------------------------------
class PrintThread extends Thread {
    SharedArea sharedArea;
    public void run() {
        while(sharedArea.isReady!=true) continue; //new challnger!!
System.out.println(sharedArea.result);
    }
}
//--------------------------------------------------------------------------------------------------
class MultiThreadExample5 
{
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();
}
}


계좌 클래스 Syncronized함수로 동기화하기
class Account {
    String accountNo;    // 계좌번호
    String ownerName;    // 예금주 이름
    int balance;         // 잔액
    Account(String accountNo, String ownerName, int balance) {   
        this.accountNo = accountNo; 
        this.ownerName = ownerName;  
        this.balance = balance;       
    }
    void  deposit(int amount)  {  //입금
        balance += amount;
    }
    int withdraw(int amount) {  //출금
        if (balance < amount)
            return 0;
        balance -= amount;
        return amount;
    }
}
//--------------------------------------------------------------------------------------------------
class SharedArea 
{
Account account1;
Account account2;
}
//--------------------------------------------------------------------------------------------------
class PrintThread extends Thread //account 클래스랑 연관
{
SharedArea sharedArea;
PrintThread(SharedArea area){//생성자
sharedArea = area;
}
public void run(){
for(int cnt=0; cnt<3; cnt++){
synchronized(sharedArea){
//이걸 써둔 얘들끼리 동기를 맞춘다. 안하면 결과값이 정확하지 않을수도 있다.
int sum = sharedArea.account1.balance + sharedArea.account2.balance;
System.out.println("계좌 잔액 합계 : " + sum);
}
try{
Thread.sleep(100);
}
catch(InterruptedException e){
System.out.println(e.getMessage());
}
}
}
}
//--------------------------------------------------------------------------------------------------
class TransferThread extends Thread 
{
SharedArea sharedArea;
TransferThread(SharedArea area){//생성자
sharedArea=area;
}
public void run(){
for(int cnt=0; cnt<12; cnt++){
synchronized(sharedArea){
sharedArea.account1.withdraw(1000000);
System.out.print("이몽룡 계좌 : 100만원 인출,");
sharedArea.account2.deposit(1000000);
System.out.println("성춘향 계좌 : 100만원 입금,");
}
}
}
}
//--------------------------------------------------------------------------------------------------
class MultithreadExample5
{
    public static void main(String[] args) 
{
        SharedArea area = new SharedArea();
        area.account1 = new Account("111-111-1111", "이몽룡", 20000000);
        area.account2 = new Account("222-222-2222", "성춘향", 10000000);
        TransferThread thread1 = new TransferThread(area);
        PrintThread thread2 = new PrintThread(area);
        thread1.start(); //Transfer
        thread2.start(); //PrintThread
//System.out.println(area.account2.ownerName);
    }
}

'JAVA' 카테고리의 다른 글

숫자 100을 25%까지 난수로 찍는 간단한 코드  (0) 2013.05.08
데드락 상황 만들기 & 해결  (0) 2013.05.07
네이트온 GUI 제작 완성  (0) 2013.05.05
멀티스레드 소스&PPT  (0) 2013.05.03
자바 3-1 중간고사  (0) 2013.04.26
,