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 >>
[JAVA]Collection(컬렉션)의 자료구조 정리 _Part04.TreeMap (0) | 2021.08.13 |
---|---|
[JAVA]Collection(컬렉션)의 자료구조 정리 _Part03.HashMap (0) | 2021.08.12 |
[JAVA]Collection(컬렉션)의 자료구조 정리 _Part02.LinkedList (0) | 2021.08.11 |
[JAVA]Collection(컬렉션)의 자료구조 정리 _Part01.ArrayList (0) | 2021.08.10 |
[Java] Generic (제네릭) 정리. (0) | 2021.07.20 |
댓글 영역