본문 바로가기
개발 수업/JAVA

[Java] 스레드 연습

by 오늘 하루s 2023. 5. 25.
728x90
더보기

Day20-3. 230525

스레드 없이 실행

은행계좌 클래스>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
package Ex;
 
//은행계좌
public class BankAccount1 {
 
    //필드
    private int balance; //잔액
    
    //생성자
    public BankAccount1(int balance) {
        this.balance = balance;
    }
    
    //메서드
    //입금기능
    public void deposit(int amount){
        balance += amount; //balance = balance + amount
        System.out.println("입금된 금액:"+amount+",현재 잔액:"+balance);
    }
    
    //출금기능
    public void withdraw(int amount){
        balance -= amount; //balance = balance - amount
        System.out.println("출금된 금액:"+amount+",현재 잔액:"+balance);
    }
    
    //잔액조회
    public int getBalance() {
        return balance;
    }
    
}
cs

 

BankSystem1 메인 클래스>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package Ex;
 
public class BankSystem1 {
 
    public static void main(String[] args) {
        //계좌생성
        BankAccount1 account = new BankAccount1(1000);
        System.out.println("계좌생성후:"+account.getBalance());
        
        //입금Thread
        account.deposit(999);
        
        //출금Thread
        account.withdraw(9);
        
        //잔액조회Thread
        System.out.println(account.getBalance());
    }
 
}
cs
더보기

* 실행 결과

계좌생성후:1000
입금된 금액:999,현재 잔액:1999
출금된 금액:9,현재 잔액:1990
1990

 

스레드 사용해서 실행

은행계좌 클래스>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
package Ex;
 
//은행계좌
public class BankAccount2 {
 
    //필드
    private int balance; //잔액
    
    //생성자
    public BankAccount2(int balance) {
        this.balance = balance;
    }
    
    //메서드
    //입금기능-sync
    public synchronized void deposit(int amount){
        balance += amount; //balance = balance + amount
        System.out.println("입금된 금액:"+amount+",현재 잔액:"+balance);
    }
    
    //출금기능-sync
    public synchronized void withdrawl(int amount){
        if(balance>=amount) {
            balance -= amount; //balance = balance - amount
            System.out.println("출금된 금액:"+amount+",현재 잔액:"+balance);
        }else {
            System.out.println("잔액부족, 현재 잔액:"+balance);
        }
    }
    
    //잔액조회-sync
    public synchronized int getBalance() {
        return balance;
    }
}
cs

동기화(synchronized) 스레드 사용

 

BankSystem2 메인 클래스>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package Ex;
 
public class BankSystem2 {
 
    public static void main(String[] args) {
        //계좌생성
        BankAccount2 account = new BankAccount2(1000);
        
        //입금
        Thread depositTh= new Thread(new DepositTask(account));
        
        //출금
        Thread withdrawlTh= new Thread(new WithdrawlTask(account));
    
        //잔액조회
        Thread balanceTh= new Thread(new BalanceTask(account));
        
        depositTh.start(); //입금
        withdrawlTh.start(); //출금
        balanceTh.start(); //잔액조회
    }
}
cs
더보기

* 실행 결과

입금된 금액:800,현재 잔액:1800
잔액부족, 현재 잔액:1800
현재 잔액 조회:1800

 

출금 업무>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package Ex;
 
//출금업무
public class WithdrawlTask implements Runnable {
 
    //필드
    private BankAccount2 account;//은행계좌
    
    //생성자
    public WithdrawlTask(BankAccount2 account) {
        this.account = account;
    }    
    
    @Override
    public void run() {
        account.withdrawl(20000);
    }
}
cs

 

입금 업무>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package Ex;
 
//입금업무
public class DepositTask implements Runnable {
 
    //필드
    private BankAccount2 account;//은행계좌
    
    //생성자
    public DepositTask(BankAccount2 account) {
        this.account = account;
    }    
    
    @Override
    public void run() {
        account.deposit(800);
    }
}
cs

 

잔액조회 업무>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package Ex;
 
//잔액조회 업무
public class BalanceTask implements Runnable {
 
    //필드
    private BankAccount2 account;//은행계좌
    
    //생성자
    public BalanceTask(BankAccount2 account) {
        this.account = account;
    }    
    
    @Override
    public void run() {
        int balance =  account.getBalance();
        System.out.println("현재 잔액 조회:"+balance);
    }
}
cs

 

 

728x90