상세 컨텐츠

본문 제목

[Java]Thread(스레드) 정리.

Language/JAVA

by Computer_x86_64 2021. 7. 22. 22:32

본문

Java Thread와 OS측면의 Thread 다 같은 스레드지만 

다르게 사용할수도 있다.  이게 충돌해서 골머리 아팠다....

OS, Java책에서 전체적인 Thread flow를 설명할 때 OS측면의 스레드를 설명해준다. 
그런데 이건 코드를 어떻게 설계하느냐에 따라 다르다.

스레드를 정지 시킬수도있고 

스레드를 깨울수도 있다.

interrupt()시 -> InterruptedException 이 발생한다. 그리고 interrupted = ture가 된다.

 

OS기준 Thread - 생성 -> 시작 - (1. 실행대기  + 실행) + 일시정지 + (1).....

1. Runnable 

그중 스레드의 interrupt() 함수를 가장 혼돈하게 된다. 

 

OS측면에서 interrupt()는 Thread가 non-Runnable(WAITING, BOLOCKED) 상태일경우 

interrupt()함수로 스레드를 깨운다.

 

하지만...Java에서는 다소 차이가 있다.

Thread를 상속받거나 Runnable을 구현해사용할수있다. 
Runnable을 구현하더라도 Thread를에 매개값으로 전달해야 사용가능하며 주로 Runnable을 많이 사용한다고한다.

(Thread를 상속받으면 다른 클래스를 상속받기 어렵기떄문이다.) C++처럼 Java는 다중상속이 되지 않기 때문이다...

 

Thread1, Thread2, main Thread가 있다....

그런데 여기서 1번 스레드를 종료해야한다.

그러면 main에서 Thread1.interrupt() 해주면 

 

Thread1은 진행을 하다가 정지된다. 그이유는 interrrupt()메소드를 호출시 조상클래스의 

static boolean interrupted = false; 이 Default인데 interrupt()호출시 true로 바꾸기 떄문이다.

그러면 Thread1이 중단되게 된다.

 

OS적인 측면 interrupt와 상반된 것처럼 보인다.

호출시 멈춰지기 때문이다. 

 

try{
	Thread.sleep(1000*10);
} catch (InterruptedException e) {
	System.out.println("wake up!");
}
실행할 코드 작성...

이렇게 코드를 짠다면 ?

interrupt()는 깨우는 코드이다.

이렇게 어떻게 기획해서 활용하느냐에 따라 다르다. 

 

아래의 코드는 interrup()를 호출해 실행중인 코드를 비활성화 하는 코드로 작성됐다.

 

아직 완벽히 flow를 이해하진 못했지만 간단히 테스트한 내용이다.

package test;

class Thread1 extends Thread{
	public void run() {
		try {
			for(int i=0; i < 10 ; i++) {
				System.out.print("(i1: " + i+"), ");
				Thread.sleep(1000);
			}
		}catch (InterruptedException e) { 
//			interrupt();
			boolean test =isInterrupted();
			System.out.println("inner : "+test);
		}
		System.out.println("<< Thread01 END >>");
	}
}
package test;

class Thread2 extends Thread {
	public void run() {
		try {
			for(int i =0; i < 10; i++) {
				System.out.println("(i2 : " +i+"), ");
				Thread.sleep(1000);
			}
		}catch(InterruptedException e) {
//			interrupt();
		}
		System.out.println("<< Thread02 END >>");
	}
}
package test;

class Thread3 extends Thread{
	public void run() {
		try { 
			for(int i =0; i < 10; i++) {
				System.out.print("(i3 : " +i+"), ");
				Thread.sleep(1000);
			}
		}catch(InterruptedException e) {
			System.out.println("Thread3 ?");
//			interrupt();
		}
		System.out.println("<< Thread03 END >>");
	}

}
package test;

public class multiThread {

	public static void main(String[] args) {
		
		Thread1 t1 = new Thread1();
		Thread2 t2 = new Thread2();
		Thread3 t3 = new Thread3();
		
		t1.setName("Thread1");
		t2.setName("Thread2");
		t3.setName("Thread3");
		
		t1.setPriority(8);
		t1.start();
		t2.start();
		t3.start();
		
		
		//interrupted default value = false;
		System.out.println("before t1.isInterrupted() : " + t1.isInterrupted());  //false;
		t1.interrupt();
		System.out.println("after t1.isInterrupted() : " + t1.isInterrupted());  //true;
		try {
			Thread.sleep(1000);
		}catch(InterruptedException e) { }
		
		System.out.println("<<main END>>");
	
	}

}

Result>>>

before t1.isInterrupted() : false
(i3 : 0), (i2 : 0), 
(i1: 0), after t1.isInterrupted() : true
inner : false
<< Thread01 END >>
<<main END>>
(i3 : 1), (i2 : 1), 
(i2 : 2), 
(i3 : 2), (i2 : 3), 
(i3 : 3), (i2 : 4), 
(i3 : 4), (i2 : 5), 
(i3 : 5), (i2 : 6), 
(i3 : 6), (i2 : 7), 
(i3 : 7), (i3 : 8), (i2 : 8), 
(i2 : 9), 
(i3 : 9), << Thread02 END >>
<< Thread03 END >>

관련글 더보기

댓글 영역