sleep() (Thread 실행제어 static 1. sleep(), 2.yield 자기 자신한테만 동작)
- 현재 스레드를 지정된 시간동안 멈추게 한다.
static void sleep(long millis) //천분의 일초 단위 3초 = 3*1000
static void sleep(long millis,int nanos) //천분의 일초 + 나노초
-예외처리를 해야한다(InterruptedException이 발생하면 깨어남)
try{
Thread.sleep(1,500000); //스레드를 0.0015초 동안 멈추게 한다.
}catch(InterruptedException e){}
스레드가 멈추는 2가지 경우
1.timeup(시간종료) 2.interrupted(깨우는것)
항상 예외처리하기 귀찮으니
void delay(long millis){
try{
Thread.sleep(millis);
} catch(InterruptedException e){}
}
delay(15); 간단하게 가능
-특정 스레드를 지정해서 멈추게 하는 것은 불가능.
public static void main(String args[]) {
ThreadEx8_1 th1 = new ThreadEx8_1();
ThreadEx8_2 th2 = new ThreadEx8_2();
th1.start(); th2.start();
delay(2*1000);
System.out.print("<<main 종료>>");
} // main
static void delay(long millis) {
try {
Thread.sleep(millis); //2초동안 잠들기
} catch(InterruptedException e) {}
}
}
class ThreadEx8_1 extends Thread {
public void run() {
for(int i=0; i < 50; i++) System.out.print("-");
System.out.print("<<th1 종료>>");
} // run()
}
class ThreadEx8_2 extends Thread {
public void run() {
for(int i=0; i < 50; i++) System.out.print("|");
System.out.print("<<th2 종료>>");
} // run()
}
결과
---------------|||||||||||||||||||||||||||------------------
||||||||||||-----------------
<<th1 종료>>|||||||||||<<th2 종료>><<main 종료>>
Interrupt()
- 대기상태(WAITING)인 스레드를 실행대기 상태(RUNNABLE)로 만든다.
void interrupt() 스레드의 isInterrupted상태를 false에서 true로 변경
boolean isInterrupted() 스레드의 isInterrupted상태를 반환
static boolean interrupted() 현재 스레드의 isInterrupted상태를 알려주고 false로 초기화
static 메서드라 호출할때 Thread.interrupted()로 해야함.
ThreadEx9_1 th1 = new ThreadEx9_1();
th1.start();
String input = JOptionPane.showInputDialog("아무 값이나 입력하세요.");
System.out.println("입력하신 값은 " + input + "입니다.");
th1.interrupt(); // interrupt()를 호출하면, interrupted상태가 true가 된다.
System.out.println("isInterrupted():"+ th1.isInterrupted()); // true
//main 쓰레드가 interrupt되었는지 확인.
System.out.println("interrupted():"+ Thread.interrupted()); // false
//Thread.interrupted는 사용하고 false로 초기화해주기 때문
}
}
class ThreadEx9_1 extends Thread {
public void run() {
int i = 10;
while(i!=0 && !isInterrupted()) {
System.out.println(i--);
for(long x=0;x<2500000000L;x++); // 시간지연.
}
System.out.println("카운트가 종료되었습니다.");
}
}
출력값
isInterrupted() : true
interrupted(): false
'하.. > java' 카테고리의 다른 글
| ch13 join() yield() (0) | 2021.12.25 |
|---|---|
| ch13 스레드 실행 일시정지suspend() 재개 resume() 완전정지 stop() (0) | 2021.12.25 |
| ch13 데몬 스레드, 스레드의 상태 (0) | 2021.12.25 |
| ch12 어노테이션 타입 정의하기 어노테이션의 요소 (0) | 2021.12.25 |
| ch12 메타 어노테이션 (0) | 2021.12.25 |