티스토리 뷰
class Account {
private int total = 0;
synchronized void deposit() {
total = total + 1000;
}
int gettotal() {
return total;
}
}
class Customer extends Thread {
Account same_a;
Customer(Account a, String s) {
same_a = a;
setName(s);
}
public void run() {
for (int i = 0; i < 200; i++) {
System.out.println(getName() + " : " + i+1 + "번째");
same_a.deposit();
if (same_a.gettotal() >= 500000)
break;
// 종료 시 5개의 스레드 중에서 가장 우선순위가 높은
// 스레드가 조건문을 만족하면 (성금이 49만 9000인 경우 deposit() 후에는 50만원이 됨)
// 나머지 4개의 스레드들도 마찬가지로 조건문을 만족하게 되어 반복문이 종료된다.
// 결과적으로 후에 출력되는 총 성금은 50만 4000원이 된다.
// 결과 값이 50만 3000원이 되는 경우는
// 1번 스레드가 deposit() 메소드를 실행하고 49만 9000이 될 때
// 정상적으로는 다음 조건문을 통과하게 되지만,
// 조건문 실행 전에 다른 스레드가 deposit() 메소드를 실행되면
// 50만원으로 조건문을 만족하게 되어 반복문을 종료하게 되는데
// 이전에 실행되던 1번 스레드 또한 조건문을 만족하게 되어 종료가 되고
// 나머지 3개의 스레드가 정상 실행되어 3천원의 성금이 추가되게 된다.
}
}
}
public class TVContribution {
public static void main(String args[]) throws Exception {
int count = 0;
Account same_account = new Account();
Customer donator1 = new Customer(same_account, "1번째 성금자");
Customer donator2 = new Customer(same_account, "2번째 성금자");
Customer donator3 = new Customer(same_account, "3번째 성금자");
Customer donator4 = new Customer(same_account, "4번째 성금자");
Customer donator5 = new Customer(same_account, "5번째 성금자");
donator1.start();
donator2.start();
donator3.start();
donator4.start();
donator5.start();
donator1.join();
donator2.join();
donator3.join();
donator4.join();
donator5.join();
System.out.println("성금 총액은 : " + same_account.gettotal());
}
}
결과 :
1번째 성금자 : 01번째
1번째 성금자 : 11번째
5번째 성금자 : 01번째
5번째 성금자 : 11번째
1번째 성금자 : 21번째
...중략...
2번째 성금자 : 701번째
4번째 성금자 : 1231번째
3번째 성금자 : 1291번째
1번째 성금자 : 1191번째
5번째 성금자 : 581번째
성금 총액은 : 504000
'java,web study > 3주차 (7월 15일 ~21일)' 카테고리의 다른 글
스레드 인터럽트 (0) | 2013.07.17 |
---|---|
데몬 스레드 (0) | 2013.07.17 |
스레드 예제 (Bank) (0) | 2013.07.17 |
JTable 02 (0) | 2013.07.17 |
JTable (0) | 2013.07.17 |