본문 바로가기

아옳옳의 코딩공부/아옳옳 자바코딩공부

2021-04-30자바공부(스레드 Thead2)

반응형

스레드의 이름

메인 스레드 이름 : main 

작업 스레드 이름 : Thread-n (0 , 2, 3,4,5 등등) 

작업 스레드 이름 변경 : thread.setName("원하는 스레드 이름");

코드 실행하는 현재 스레드 객체의 참조 얻기 : Thread thread = Thread.currentThread();

 

 

스레드의 상태

 

스레드의 상태에 따른 생명주기 

일단 위에서부터 살펴 보자 맨위에 스래드를 생성하고 Start 하게 되면 new 상태에서 RUNNABLE 상태로 내려온다 

그런데 RUNNABLE 상태는 2곳이 존재를 하는데 한곳은 대기실이고 나머지 한곳은 실행 되는 곳이라고 생각하면된다 

 

예를 들어 코어가 2개 뿐이라 2가지 일밖에 못하는 상황에 스레드를 3가지를 만들게 되면 우선순위가 높은 스레드 먼저 실행을 할것이고 나머지 한개는 대기실이라고 칭한곳에서 대기를 하는 식이다.

그 실행중인 스레드가 작업을 끝내거나 다른 상황으로 가게 된다면 그때서야 대기하던 스레드도 작업을 하는 식으로 흘러 간다 

 

그림을 보면 몇가지 메소드들이 보이는데 하나씩 살펴 보자 

 

말그대로 슬립 재워 버리는거다 일정시간 스탑 상태가 된다 

 

대기 상태에서 양보하는 개념이라 생각하면된다. 먼저 작업을 할수 있도록 양보한다 

 

다른스레드의 종료를 기다린다 . 어제 공부한 내용을 보면 이해가 쉬울것인데 메인은 메인 스레드가 존재를 하고 

내가 따로 만들어 놓은 스레드를 동시에 작동시켰을 경우 메인의 작업이 먼저 끝날경우 종료가 되버린다. 

하지만 그렇게 종료되기를 원하지 않고 나머지 스레드가 종료 될때까지 기다렸다가 작업을 수행하고 싶은경우에 사용이 된다. 

 

스레드에 우선순위줄때 사용되는 메소드이다 . 

보통 1에서 10까지 있지만 아무것도 설정 안했을 경우에 5로 설정이 된다. 

이값들은 상수로 지정이 되어있다. 

 

//////////////////////스레드
public class CalcThread extends Thread{

		public CalcThread (String name) {
			setName(name);
			
		}

		@Override
		public void run() {
			for(int i =0 ; i<2000000000 ; i++) {
				
			}
			System.out.println(getName());
		}
		
}

//////////////////////메인

public class priority_Ex {

	public static void main(String[] args) {
	
		for(int i =1 ; i<=10; i++) {
			Thread thread = new CalcThread("Thread-" + i);
			if(i!= 10) {
				thread.setPriority(Thread.MIN_PRIORITY);
			}else {
				thread.setPriority(Thread.MAX_PRIORITY);
			}
			thread.start();
		}

	}

}

작동했을때의 결과 값이다. 나머지 스레드는 같이 5를 주고 10에만 10을 줬다 

그런데 보면 결과가 10이 4번째에 있는걸 볼수 있는데 우선순위가 높다고 항상 먼저 끝나는것은 아니다 

작업의 우선순위가 높아서 제일 나중에 생성이 되었지만 평균적으로 다른 스레드에 비해 빨리 끝난것을 보면 알수 있고 매번 실행 할때마다 값은 달라지겠지만 평균적으로 우선순위가 높은 10이 먼저 끝난다 

 

 

스레드의 종료

이것은 따로 메소가 있다기보다는 관행에따라 인터럽트 발생되었을때 스레드가 종료 되도록 만들어 놓은것이다 , 

 

 

위에서 부터 보면 interrupt() 와 interrupted() 가있는데 

interrupt()는 예외를 발생시키고 interrupted()는 예외가 발생했는지 알 수 있다.

 

다음 예제를 보자 

무한루프를 돌고 있는 스레드라면 다음 사진처럼해서 강제로 종료를 해줄수도 있다

 

데몬스레드

스레드와 거의 동일하지만 굳이 사용하는 이유는 이 데몬스레드는 메인스레드가 종료 되면 같이 종료되는 성질을 가지고 있다. 

 

 

 

마우스를 학원에 놓고 오는 내가 코드를 직접 쳐봐야 하는데 아무래도 마우스없이 많이 불편해서 오늘은 여기까지로 마무리 하자~~ ㄱ

반응형