[Java 기능] Thread 클래스의 여러 메서드

2022. 2. 18. 18:02·Java & Kotlin

Thread 우선순위

  • Thread.MIN_PRIORITY (1) ~ Thread.MAX_PRIORITY (10)
  • 우선순위 따로 설정해주지 않았을 때 default 우선순위는 Thread.NORM_PRIORITY (5)
  • 우선 순위가 높은 쓰레드가 CPU의 배분을 먼저 받을 확률이 높음 (무조건은 아님)

 

예제 코드

PriorityTest.java
package ch21;

class PriorityThread extends Thread {
	
	public void run() {
		
		int sum = 0;
		
		Thread t = Thread.currentThread(); 
		System.out.println(t + "start");
		
		for(int i = 0; i <= 1000000; i++) {	// 연산 수행
			sum += i;
		}
		
		System.out.println(t.getPriority() + "end");
	}
}

public class PriorityTest {

	public static void main(String[] args){
		
		int i;
		
		for(i = Thread.MIN_PRIORITY ; i <= Thread.MAX_PRIORITY ; i++ ) {
			
			PriorityThread pt = new PriorityThread();	
			pt.setPriority(i);	// 쓰레드에 우선순위(1~10 부여)
			pt.start();
		
		}
		
	}

 


join() 메서드

  • 동시에 두개 이상의 쓰레드가 실행될 때 다른 쓰레드의 결과를 참조하여 실행해야 하는 경우 호출
  • join() 함수를 호출한 쓰레드가 not runnable 상태가 됨
  • 다른 쓰레드의 수행이 끝나면 runnable 상태로 돌아옴
  • 쓰레드가 join(), sleep(), wait() 메서드에 의해 not runnable 상태일 때 interrupt() 메서드를 호출하면 interrupt exception을 발생시키고 runnable 상태가 됨 

 

예제 코드

두 쓰레드를 생성하여 하나의 쓰레드에서는 1~50의 숫자를 더하고, 다른 쓰레드에서는 51~100을 더하는 연산을 수행한다.

 

join() 메서드를 호출하지 않았을 때
  • 쓰레드가 연산 진행 중에 변수에 값이 저장됨
  • 출력문은 쓰레드 종료 후 수행
package ch21;

public class JoinTest extends Thread{
	
	int start;
	int end;
	int total;
	
	public JoinTest(int start, int end) {
		this.start = start;
		this.end = end;
	}
	
	public void run() {
		
		int i;
		for (i = start; i <= end ; i ++ ) {
			total += i;
		}
	}
	
	public static void main(String[] args) {
		
		int sum = 0;
		
		JoinTest jt1 = new JoinTest(1,50);
		JoinTest jt2 = new JoinTest(51,100);
		
		jt1.start();
		jt2.start();
				
		int lastTotal = jt1.total + jt2.total;	// 쓰레드가 종료하지 않은 상태에서 실행
		
		System.out.println("jt1.total= " + jt1.total);	// 쓰레드 끝나고 실행
		System.out.println("jt2.total= " + jt2.total);
		
		System.out.println("last total= " + lastTotal);
		
		
	}

}

 

수행 결과
  • 수행할 때마다 다른 결과 출력됨
jt1.total= 1275
jt2.total= 3775
last total= 0

 

join 메서드 추가
  • main 쓰레드에서 jt1과 jt2의 join() 메서드를 호출
  • main 쓰레드는 jt1과 jt2가 종료될 때까지 기다림
  • lastTotal은 main 쓰레드가 취하는 값으로 두 쓰레드가 종료된 후 저장됨
  • 만약 jt1, jt2가 끝나지 않으면 InterruptedException을 발생시켜 catch문을 실행하게 됨
...
jt1.start();
jt2.start();

try {
    jt1.join();
    jt2.join();
} catch (InterruptedException e) {	// interrupt Exception 예외 처리
    e.printStackTrace();
}	

int lastTotal = jt1.total + jt2.total;
...

 


쓰레드 종료 예제 코드

세 개의 thread를 만든다.
각각 무한 루프를 수행하게 한다.
작업 내용 this.sleep(100);

‘A’ 를 입력 받으면 첫 번째 thread를
‘B’ 를 입력 받으면 두 번째 thread를
‘C’ 를 입력 받으면 세 번째 thread를
‘M’을 입력 받으면 모든 thread와 main() 함수를 종료한다.

 

TerminateThread.java
  • 무한 루프의 경우 while(flag)에서 flag 값을 false로 변경하여 종료시킴
package ch21;

import java.io.IOException;

public class TerminateThread extends Thread{
	
	private boolean flag = false;
	int i;
	
	public TerminateThread(String name) {
		super(name);
	}
	
	public void run() {
		
		while(!flag) {	// 무한 루프
			try {
				sleep(100);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		
		System.out.println(getName() + " end");
	}
	
	public void setFlag(boolean flag) {
		this.flag = flag;
	}
	
	public static void main(String[] args) throws IOException {
		
		TerminateThread th1 = new TerminateThread("A");	// String 값 매개변수는 쓰레드의 이름
		TerminateThread th2 = new TerminateThread("B");
		TerminateThread th3 = new TerminateThread("C");
		
		th1.start();
		th2.start();
		th3.start();
		
		System.out.println("종료할 Thread의 이름을 입력하세요.");
		
		int in;
		
		while(true){
			in = System.in.read();
			if ( in == 'A'){
				th1.setFlag(true);
			}else if(in == 'B'){
				th2.setFlag(true);
			}else if( in == 'C'){
				th3.setFlag(true);
			}else if( in == 'M'){
				th1.setFlag(true);
				th2.setFlag(true);
				th3.setFlag(true);
				break;
			}
		}

		System.out.println("main end");	
	}

}

 

수행 결과

 

저작자표시 비영리 변경금지 (새창열림)

'Java & Kotlin' 카테고리의 다른 글

[Java 기능] 동기화 구현 (1) - 리소스 하나를 공유하는 경우  (0) 2022.02.18
[Java 기능] 쓰레드(Thread)  (0) 2022.02.18
[Java 기능] Decorator Pattern 활용한 커피머신 프로그램  (0) 2022.02.17
'Java & Kotlin' 카테고리의 다른 글
  • [Java 기능] 동기화 구현 (2) - 한정적인 리소스에 접근하는 경우
  • [Java 기능] 동기화 구현 (1) - 리소스 하나를 공유하는 경우
  • [Java 기능] 쓰레드(Thread)
  • [Java 기능] Decorator Pattern 활용한 커피머신 프로그램
Sue
Sue
개발 공부 로그
  • Sue
    Sue's devlog
    Sue
  • 전체
    오늘
    어제
    • 분류 전체보기 (122)
      • Algorithm (2)
      • WEB (8)
      • Java & Kotlin (83)
      • Spring (26)
      • Database (1)
      • Infra (0)
      • Git (1)
      • devlog (1)
  • 인기 글

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Sue
[Java 기능] Thread 클래스의 여러 메서드
상단으로

티스토리툴바