상세 컨텐츠

본문 제목

ch 6.21~ thread 메소드들

패캠스프링/part2_java

by hippo0207 2022. 7. 18. 16:14

본문

21. Thread 클래스의 여러 메서드들

 

Chapter6/6-21 · master · Youngju-Jang / Javacoursework · GitLab

GitLab.com

gitlab.com

Thread 우선순위

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

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

}
=-=========================
Thread[Thread-2,3,main]start
Thread[Thread-5,6,main]start
Thread[Thread-9,10,main]start
Thread[Thread-8,9,main]start
Thread[Thread-7,8,main]start
Thread[Thread-6,7,main]start
10end
Thread[Thread-4,5,main]start
7end
6end
Thread[Thread-3,4,main]start
Thread[Thread-0,1,main]start
8end
9end
Thread[Thread-1,2,main]start
1end
5end
3end
2end
4end
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();
=================
Thread[Thread-2,10,main]start
10end
Thread[Thread-0,1,main]start
Thread[Thread-1,5,main]start
1end
5end

 

join()

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

1부터 50, 51부터 100 까지의 합을 구하는 두 개의 Thread를 만들어 그 결과를 확인해보세요

멤버변수(클래스변수와 인스턴스변수)와 배열의 초기화는 선택적이지만
지역변수의 초기화는 필수적이다.
  • join안하면 main스레드가 더빨라버림
package ch6;

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) {
    
		System.out.println(Thread.currentThread() + "start");
		JoinTest jt1 = new JoinTest(1, 50);
		JoinTest jt2 = new JoinTest(51, 100);
		
		jt1.start();
		jt2.start();
		
		int lastTotal = jt1.total + jt2.total;     >> total계산전에 수행됨  >> 0들어감
		
		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");
	}

}
===================
Thread[main,5,main]start
jt1.total = 0
jt2.total = 0
lastTotal = 0
Thread[main,5,main]end
  • join 넣으면>> 
public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		System.out.println(Thread.currentThread() + "start");
		JoinTest jt1 = new JoinTest(1, 50);
		JoinTest jt2 = new JoinTest(51, 100);
		
		jt1.start();
		jt2.start();
		
		//main이 jt1,2에 join걺 >> main은 수행x 대기
		try {
			jt1.join();
			jt2.join();
		} catch (InterruptedException e) { 
			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");
        
=================
Thread[main,5,main]start
jt1.total = 1275
jt2.total = 3775
lastTotal = 5050
Thread[main,5,main]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() 함수를 종료한다.
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");  >> 스레드이름이 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");
		
	}
}
===================
A
type again
type again
A end
C
type again
type again
C end

type again
type again
C
type again
type again
M
main end
B end

관련글 더보기

댓글 영역