원주율을 구하여 출력하는 멀티스레드 예제
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 |