=============================코드=============================
class ThreadA extends Thread {
public ThreadA() { }
public ThreadA(String name) {
super(name);
} // 인자 생성자
@Override
public void run() {
// getName() : 현재 run() 메서드를 실행 중인 스레드 클래스의 이름을 가져오는 메서드
System.out.println(this.getName());
}
}
public class Thread_06 {
public static void main(String[] args) {
// 멀티 스레드 (스레드 이름이 동일한데 여러 스레드 객체 생성)
ThreadA t1 = new ThreadA("첫번째 스레드");
ThreadA t2 = new ThreadA("두번째 스레드");
ThreadA t3 = new ThreadA("세번째 스레드");
ThreadA t4 = new ThreadA("네번째 스레드");
ThreadA t5 = new ThreadA("다섯번째 스레드");
ThreadA t6 = new ThreadA("여섯번째 스레드");
// 순서적으로 작성하더라도 무분별하게 출력됨 -> 내용을 포함하고 있는지 확인용
t1.start(); t2.start(); t3.start();
t4.start(); t5.start(); t6.start();
}
}
순서대로 작성하였으나 무분별하게 출력!

[공용 ATM 클래스 설계서]
- 입금과 출금의 은행 거래가 가능한 ATM 공용 클래스 설계
- 계좌잔액 : private int balance;
- 생성자 : 계좌 잔액(balance) 초기화
- deposit() : 외부 클래스에서 입금하는 메서드
예) balance = balance + money; -----> 잔액에 입금액을 더함
출력문 : 00,000원을 입금하여 00,000원 남음- withdraw() : 외부 클래스에서 출금하는 메서드
예) balance = balance - money; -----> 잔액에서 출금액을 차감
출력문 : 00,000원을 출금하여 00,000원 남음
(단, balance < money 인 경우 "잔액이 부족합니다." 라는 메세지 출력)
=============================코드=============================
class ATM {
private int balance; // 계좌 잔액 변수
public ATM() { } // 기본 생성자
public ATM(int balance) {
this.balance = balance;
} // 인자 생성자
// 입금을 하는 메서드
public synchronized void deposit(int money) { // money는 매개변수 / synchoronized는 한 사람이 실행한 것을 끝날때까지 제한해줌
balance += money; // balance = balance + money;
// 현재 스레드를 멀티 스레드로!
System.out.println(Thread.currentThread().getName() + "님이" + money + "원을 입금하여 "+ balance + " 원이 남았습니다.");
}
// 출금을 하는 메서드
public synchronized void withdraw(int money) {
if(money > balance) {
System.out.println("잔액이 부족합니다.");
return; // 현재의 실행중인 메서드를 종료하는 명령어
}
balance -= money;
System.out.println(Thread.currentThread().getName() + "님이" + money + "원을 출금하여 "+ balance + " 원이 남았습니다.");
}
} // ATM 클래스 end
// 스레드를 구현할 클래스
class User extends Thread {
ATM atm; // ATM 클래스를 멤버로 갖는다
public User() { } // 기본생성자
public User(ATM atm, String name) {
super(name); // 스레드 클래스의 인자생성자를 가져오겠다는 뜻 / 멀티 스레드 때문에 사용
this.atm = atm;
} // 인자생성자
@Override
public void run() {
atm.deposit(20000);
atm.withdraw(30000);
}
}
public class Thread_07 {
public static void main(String[] args) {
ATM atm = new ATM(0); // atm은 참조변수 ==> 따라서 힙 메모리 객체의 주소값을 가지고 있음
// User클래스를 대상으로 멀티 스레드 객체를 생성
User user1 = new User(atm, "홍길동"); // user1~5의 동일한 주소값을 갖고 있다!
User user2 = new User(atm, "세종대왕");
User user3 = new User(atm, "유관순");
User user4 = new User(atm, "이순신");
User user5 = new User(atm, "신사임당");
user1.start(); user2.start(); user3.start();
user4.start(); user5.start();
}
}
