본문 바로가기

Programming/JAVA

멀티 스레드(6) - 스레드 상태 제어 5 : 스레드 간 협업 2

 

 

 

앞선 아티클에서 스레드 간 협업을 위한 메서드의 기본적인 사용법을 알아보았습니다. 이번에는 예제를 통해서, 앞선 스레드 간 협업을 위한 메서드 사용을 구체적으로 살펴보겠습니다. 

 

 


 

 

 

이번 예제에서 두 스레드인 ThreadAThreadB의 작업을 살펴보겠습니다.

- 공유객체인 WorkObject에서 두 스레드의 작업을 methodA( ) / methodB( )에 정의합니다.

- 두 스레드 ThreadA와 ThreadB가 교대로 methodA( )와 methodB( )를 호출합니다. 

 

 

// WorkObject.java
// 두 스레드의 작업 내용을 동기화 메서드로 작성한 공유 객체
public class WorkObject {
	public synchronized void methodA() {
		System.out.println("ThreadA의 methodA() 작업 실행");
		
		// 일시 정지의 ThreadB를 실행 대기 상태로 만듬
		notify();
		
		try {
			// ThreadA를 일시 정지 상태로 만듬
			wait();
		} catch (InterruptedException e) {
			
		}
	}
	
	
	public synchronized void methodB() {
		System.out.println("ThreadB의 methodB() 작업 실행");
		
		// 일시 정지의 ThreadA를 실행 대기 상태로 만듬
		notify();
		
		try {
			// ThreadB를 일시 정지 상태로 만듬
			wait();
		} catch (InterruptedException e) {
			
		}

	}
}

 

 

// ThreadA.java
public class ThreadA extends Thread {
	private WorkObject workObject;
	
	public ThreadA(WorkObject workObject) {
		this.workObject = workObject;
	}
	
	@Override
	public void run() {
		// 공유 객체의 methodA() 10번 반복 호출
		for(int i = 0; i < 10; i++) {
			workObject.methodA();
		}
	}
}

 

 

// ThreadB.java
public class ThreadB extends Thread {
	private WorkObject workObject;
	
	public ThreadB(WorkObject workObject) {
		this.workObject = workObject;
	}
	
	@Override
	public void run() {
		// 공유 객체의 methodA() 10번 반복 호출
		for(int i = 0; i < 10; i++) {
			workObject.methodB();
		}
	}

}

 

 

// ExampleMain.java
import java.awt.Toolkit;

public class ExampleMain {
	public static void main(String[] args) {
		WorkObject sharedObject = new WorkObject();
		
		ThreadA threadA = new ThreadA(sharedObject);
		ThreadB threadB = new ThreadB(sharedObject);
		
		threadA.start();
		threadB.start();
	}
}

/* 출력
ThreadA의 methodA() 작업 실행
ThreadB의 methodB() 작업 실행
ThreadA의 methodA() 작업 실행
ThreadB의 methodB() 작업 실행
ThreadA의 methodA() 작업 실행
ThreadB의 methodB() 작업 실행
ThreadA의 methodA() 작업 실행
ThreadB의 methodB() 작업 실행
ThreadA의 methodA() 작업 실행
ThreadB의 methodB() 작업 실행
ThreadA의 methodA() 작업 실행
ThreadB의 methodB() 작업 실행
ThreadA의 methodA() 작업 실행
ThreadB의 methodB() 작업 실행
ThreadA의 methodA() 작업 실행
ThreadB의 methodB() 작업 실행
ThreadA의 methodA() 작업 실행
ThreadB의 methodB() 작업 실행
ThreadA의 methodA() 작업 실행
ThreadB의 methodB() 작업 실행
*/