자바의 정석 Chapter13 쓰레드 Thread

MinJee Lee·2022년 4월 9일
1

Java

목록 보기
5/10
post-thumbnail

yield()

  • 다음 차례에 쓰레드에게 실행시간을 양보할 때 사용
  • yeild() 와 interrypt()를 적절히 사용해 응답성이 높고 효율성적인 실행이 가능하게 프로그램을 구현할 수 있다.
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()에서 예외가 발생해 즉시 정지 상태에서 벗어날 수 있으므로 지연 시간을 없앨 수 있다.

join()

  • 지정된 시간 동안 특정 쓰레드가 작업하는 것을 기다린다.
  • 자신이 하던 작업을 잠시 멈추고 다른 쓰레드가 지정된 시간 동안 작업을 수행하도록 할 때 사용
  • 시간을 지정하지 않으면 해당 쓰레드가 작업을 모두 마칠 때까지 기다리게 되는데, 작업 중에 다른 쓰레드의 작업이 먼저 수행되어야 할 때 사용
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이 종료된다.

0개의 댓글