본문 바로가기
언어/JAVA

Thread 2 (여러 메서드)

by step 1 2021. 5. 29.
반응형

Thread 우선순위

  • Thread.MIN.PRIORITY(=1) ~ Thread.MAX.PRIORITY(=10)
  • 디폴트 우선순위: Thread.NORMAL_PRIORITY(=5)
  • 우선 순위가 높은 Thread가 CPU의 배분을 받을 확률이 높다.
  • setPriority()/getPriority()

예제

package ch67;

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);
//			pt.start();
//		
//		}
		
		PriorityThread pt1  = new PriorityThread();
		PriorityThread pt2  = new PriorityThread();
		PriorityThread pt3  = new PriorityThread();
		
		pt1.setPriority(Thread.MIN_PRIORITY);
		pt2.setPriority(Thread.NORM_PRIORITY);
		pt3.setPriority(Thread.MAX_PRIORITY);
		
		pt1.start();
		pt2.start();
		pt3.start();
	}

}

 

join()

  • 동시에 두 개 이상의 Thread가 실행 될 때 다른 Thread의 결과를 참조하여 실행해야 하는 경우 join()함수를 사용
  • join() 함수를 호출한 Thread가 not-runnable 상태가 됨
  • 다른 Thread의 수행이 끝나면 runnable 상태로 돌아옴

1부터 50, 51부터 100까지의 합을 구하는 두 개의 Thread를 만드는 예제

package ch67;

public class JoinTest extends Thread{

	int start;
	int end;
	int total;
	
	public JoinTest(int start, int end) {
	
		this.start = start;
		this.end = end;
	}
	
	@Override
	public void run() {
		// TODO Auto-generated method stub
		int i;
		for (i = start; i <= end; i++) {
			total += i;
		}
	}
	
	public static void main(String[] args) {
	
		System.out.println(Thread.currentThread() + " start");
		JoinTest jt1 = new JoinTest(1, 50);
		JoinTest jt2 = new JoinTest(51, 100);
		
		jt1.start();
		jt2.start();
		
//		join한 스레드가 끝나지 않을 경우 예외처리
		try {
			jt1.join();
			jt2.join();
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			
		}
		
		
		int lastTotal = jt1.total + jt2.total;
		
		System.out.println("jt1.total= " + jt1.total);
		System.out.println("jt2.total= " + jt2.total);
		
		System.out.println("lastTotal= " + lastTotal);
		
		System.out.println(Thread.currentThread() + " end");
	}
}

 

interrupt()

  • 다른 Thread에 예외를 발생시키는 interrupt를 보낸다.
  • Thread가 join(), sleep(), wait() 함수에 의해 not-runnable 상태일 때 interrupt()메서드를 호출하면 다시 runnable 상태가 될 수 있음

Thread 종료하기

  • Thread를 종료할 때 사용함
  • 무한 반복의 경우 while(flag)의 flag 변수 값을 false로 바꾸어 종료를 시킴

Thread 종료하기 예

세 개의 thread를 만든다

각각 무한 루프를 수행하게 한다.

작업 내용 this.sleep(100);

'A'를 입력 받으면 첫 번째 thread를 

'B'를 입력 받으면 두 번째 thread를

'C'를 입력 받으면 세 번째 thread를

'M'을 입력 받으면 모든 thread와 main() 함수를 종료한다.

 

package ch67;

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) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
		System.out.println( getName() + " end" );
		
	}
	
	public void setFlag(boolean flag){
		this.flag = flag;
	}
	
	
	public static void main(String[] args) throws IOException {

		TerminateThread threadA = new TerminateThread("A");
		TerminateThread threadB = new TerminateThread("B");
		TerminateThread threadC = new TerminateThread("C");
		
		threadA.start();
		threadB.start();
		threadC.start();
		
		int in;
		while(true){
			in = System.in.read();
			if ( in == 'A'){
				threadA.setFlag(true);
			}else if(in == 'B'){
				threadB.setFlag(true);
			}else if( in == 'C'){
				threadC.setFlag(true);
			}else if( in == 'M'){
				threadA.setFlag(true);
				threadB.setFlag(true);
				threadC.setFlag(true);
				break;
			} /*
				 * else{ System.out.println("type again"); }
				 */
		}
		
		System.out.println("main end");
		
	}

	
}

반응형

'언어 > JAVA' 카테고리의 다른 글

wait() / notify() 메서드를 활용한 동기화 프로그래밍  (0) 2021.05.29
Thread 3 (멀티 스레드 동기화)  (0) 2021.05.29
Thread 1  (0) 2021.05.23
데코레이터 패턴  (0) 2021.05.23
입출력 클래스(File, RandomAccessFile)  (0) 2021.05.23