티스토리 뷰

[JAVA]/JAVA

<Thread> Join()

춘햄 2021. 3. 31. 12:12

스레드는 기본적으로 메인과 따로 작동을 하기 때문에 Main 안에 어떤 순서로 스레드를 놓아도 따로따로 실행이 된다. 

그러나 특정 데이터 값의 연산이나 특정 작업을 각 스레드가 모두 종료된 뒤에 실행되게끔 만드려면, 각각의 스레드가 모두 종료될 때까지 대기하다 Main을 끝마쳐야 한다.  

이럴 때 사용하는 메서드가 바로 join() 메서드이다. 

 

ARS로 모금을 진행하는 간단한 예제로 이해해보자.


○Account: 

package com.choonham;

public class Account {    //모금함
	
	private int total = 0;
	

	public Account() {
	
	}
	
	public void deposit() {
		this.total = this.total + 1000;
		
	}
	
	public int getTotal() {
		return total;
	}

}

○Customer:

package com.choonham;

public class Customer extends Thread{

	Account act = null;
	
	public Customer() {
		// TODO Auto-generated constructor stub
	}
	
	public Customer(Account c, String s) {
		this.act = c;
		this.setName(s);
	}
	public void run() {
		for(int i = 0; i < 200; i++) {
			System.out.println(this.getName() + " : " + i + " 번째");
			act.deposit();
			
			if(act.getTotal() > 500000) {
				break;
			}
		}
	}
}

○Main:

package com.choonham;

public class MainClass {

	public static void main(String[] args) {
		Account a = new Account();
		Customer c1 = new Customer(a, "1번  ARS");
		Customer c2 = new Customer(a, "2번  ARS");
		Customer c3 = new Customer(a, "3번  ARS");
		Customer c4 = new Customer(a, "4번  ARS");
		Customer c5 = new Customer(a, "5번  ARS");
		
		c1.start(); 
		c2.start(); 
		c3.start(); 
		c4.start(); 
		c5.start(); 
		
		try {
			c1.join();
			c2.join();
			c3.join();
			c4.join();
			c5.join();
		}catch(InterruptedException e) {
			System.out.println(e.getMessage());
		}
		
		System.out.println("총 모금액 : " + a.getTotal());
	}

}

5개의 스레드를 모두 돌리며 총 모금액이 500000원을 넘었을 때 Main으로 돌아와 총 모금액을 출력해야한다면, 위와 같이 각각의 스레드에 join() 메서드를 모두 실행시켜 Main 메서드의 진행을 대기시킬 수 있다.

Comments