스레드객체.getState();
class TargetThread extends Thread {
@Override
public void run() {
for (long i = 1; i <= 1000000000L; i++) {} // 시간 지연용
try {
Thread.sleep(1500); // TIMED_WAITING
} catch (InterruptedException e) {
e.printStackTrace();
}
for(long i=1; i<=1000000000L; i++) {} // 시간 지연용
}
}
class StatePrintThread extends Thread {
private Thread targetThread; // 상태를 출력할 쓰레드가 저장될 변수
public StatePrintThread(Thread targetThread) {
this.targetThread = targetThread;
}
@Override
public void run() {
while (true) {
// Thread의 상태 구하기 (getState()메서드 이용)
Thread.State state = targetThread.getState();
System.out.println("타켓 스레드의 상태값 : " + state);
// sleep으로 자고 있을때: TIME-WAITING
// for문돌아갈때: RUNNABLE
// 다끝나면 TERMINATED...
// NEW 상태인지 검사
if (state == Thread.State.NEW) {
targetThread.start(); // main에서 start시켜주는게 아니고 여기서 NEW체크후 start
}
// 타켓스레드가 종료 상태인지 검사
if (state == Thread.State.TERMINATED) {
break;
}
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public class T10_ThreadStateTest {
public static void main(String[] args) {
StatePrintThread spt = new StatePrintThread(new TargetThread());
spt.start();
} // main
} // class
class YieldThread1 extends Thread{
@Override
public void run() {
for(int i = 1; i<=100; i++) {
System.out.println("YieldTest1 : " + i);
yield(); // 양보하기
}
}
}
class YieldThread2 extends Thread{
@Override
public void run() {
for(int i = 1; i<=100; i++) {
System.out.println("YieldTest2 : " + i);
}
}
}
Thread th1 = new YieldThread1();
Thread th2 = new YieldThread2();
th1.start();
th2.start();
class ThreadStopEx1 extends Thread {
private boolean stop; // 멤버변수 자동 초기화됨. 초기화값: false
public void setStop(boolean stop) {
this.stop = stop;
}
@Override
public void run() {
while(!stop) {
System.out.println("쓰레드 처리중...");
}
System.out.println("자원 정리중...");
System.out.println("실행 종료.");
}
}
ThreadStopEx1 th = new ThreadStopEx1();
th.start();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//th.stop(); // 강제종료. deprecated. 쓰지마!
th.setStop(true); // 상태 체크 후에 스레드 종료
// interrupt()메서드를 이용한 쓰레드 멈추기
ThreadStopEx2 th2 = new ThreadStopEx2();
th2.start();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
th2.interrupt();// main이 th2를 interrupt한 것
// Runnable 상태에서는 interrupt 걸리지 않음, sleep 상태에만 interrupt 가능
class ThreadStopEx2 extends Thread {
@Override
public void run() {
try{
while(true){ // while문을 try안에 배치함으로써 예외발생시 catch후 종료
System.out.println("쓰레드 처리 중...");
Thread.sleep(1);
}
} catch (InterruptedException e) {
e.printStackTrace(); // 주석처리하면 깔끔하게 종료됨!
}
}
System.out.println("자원 정리 중...");
System.out.println("실행 종료.");
}
e.printStackTrace();
주석처리하면 깔끔하게 종료됨class ThreadStopEx2 extends Thread {
@Override
public void run() {
while(true){
System.out.println("쓰레드 처리 중...");
// 인스턴스 메서드 isInterrupted()
if(this.isInterrupted()) { // interrupt()메서드가 호출되면 true
System.out.println("인스턴스용 isInterrupted()");
break;
}
}
System.out.println("자원 정리 중...");
System.out.println("실행 종료.");
}
class ThreadStopEx2 extends Thread {
@Override
public void run() {
while(true){
System.out.println("쓰레드 처리 중...");
// 정적 메서드 interrupted()
if(Thread.interrupted()) { // interrupted() 메서드가 호출되면 true
System.out.println("정적메서드 interrupted()");
break;
}
}
System.out.println("자원 정리 중...");
System.out.println("실행 종료.");
}
}