public void run() {
String name =th.getName();
while(!stopped) {
if(!suspended) {
System.out.println(name);
try {
Thread.sleep(1000);
} catch(InterruptedException e) {
System.out.println(name + " - interrupted");
}
} else {
Thread.yield(); // yield() 추가
}
}
System.out.println(name + " - stopped");
}
만약 else부분이 없는 코드라고 가정하자 그러면 suspended가 True일 경우 (실행을 멈춘 상태) while문을 의미 없이 도는 것과 같다 (=바쁜 대기상태.) 하지만 else에서 Thread.yield()로 실행시간을 양보함으로써 while문에서 시간낭비를 하지 않고 양보함으로써 효율적인 프로그램이 될 수 있다.
public void suspend() {
suspended = true;
th.interrupt();
System.out.println(th.getName() + " - interrupt() by suspend()");
}
public void stop() {
stopped = true;
th.interrupt();
System.out.println(th.getName() + " - interrupt() by stop()");
}
만약 Thread.sleep(1000)으로 1초 동안 정지 상태일 때 , stop이 호출 된다면, stopped가 True로 변경되도 쓰레드가 정지 될 때까지 지연이 생긴다. 하지만 Interrypt를 호출 하면 sleep()에서 예외가 발생해 즉시 정지 상태에서 벗어날 수 있으므로 지연 시간을 없앨 수 있다.
class ThreadEx19 {
static long startTime = 0;
public static void main(String args[]) {
ThreadEx19_1 th1 = new ThreadEx19_1();
ThreadEx19_2 th2 = new ThreadEx19_2();
th1.start();
th2.start();
startTime = System.currentTimeMillis();
try {
th1.join(); // main쓰레드가 th1의 작업이 끝날 때까지 기다린다.
th2.join(); // main쓰레드가 th2의 작업이 끝날 때까지 기다린다.
} catch(InterruptedException e) {}
System.out.print("소요시간:" + (System.currentTimeMillis() - ThreadEx19.startTime));
} // main
}
class ThreadEx19_1 extends Thread {
public void run() {
for(int i=0; i < 300; i++) {
System.out.print(new String("-"));
}
} // run()
}
class ThreadEx19_2 extends Thread {
public void run() {
for(int i=0; i < 300; i++) {
System.out.print(new String("|"));
}
} // run()
}
join을 사용하지 않을 경우 th1,th2가 안끝났어도 main이 종료 되면 프로그램이 종료 된다.
하지만 join을 사용하면 th1,th2 작업을 기다린 후 Main이 종료된다.