JAVA 12강_4_멀티 스레드, 스레드 이름 지정 + 활용 문제

열라뽕따히·2024년 3월 2일

JAVA

목록 보기
77/79

멀티 스레드와 스레드 이름 지정

  • 멀티 스레드 : 하나의 스레드 클래스를 대상으로 2개 이상의 스레드 객체를 생성하는 기법
  • 스레드 이름 지정 : 멀티 스레드에서 생성한 스레드 객체에 이름을 부여하는 과정을 말함
  • 형식) super(name);
  • 멀티 스레드는 자신의 이름을 가지고 있음
  • 스레드의 이름이 스레드에서 큰 역할을 하지는 않지만 만약, 디버깅을 할 때 현재 어떤 스레드가 실행이 되어 작업을 하고 있는지를 확인하고자 할 때 사용이 많이 됨





=============================코드=============================

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();
		
	}

}

=============================실행=============================

0개의 댓글