Hello

Java 쓰레드의 실행제어 메서드

by 볼빵빵오춘기
더보기

Thread실행 제어 - static이 붙은 메서드

  • sleep()
  • yiled()

⇒ 자기자신

 

sleep()

  • 현재 쓰레드를 지정된 시간동안 멈추게 한다.
  • 예외처리를 해야 한다.(InterruptedException이 발생하면 깨어난다.)
  • 특정 쓰레드를 지정해서 멈추게 하는 것은 불가능하다.

 

예제 코드

더보기
public class Try {

	public static void main(String[] args) {

		ThreadEx8_1 th1 = new ThreadEx8_1();
		ThreadEx8_2 th2 = new ThreadEx8_2();
		th1.start(); th2.start();

// => main스레드가 잠자게 되는것
// 주석1 start
//		try {
//			th1.sleep(2000);	// th1을 2초동안 잠자게
//			Thread.sleep(2000);	// th1을 2초동안 잠자게
//		} catch(InterruptedException e) {}
// 주석1 end

//------------------------------

// 주석2 start
//		try {
//			th1.sleep(2000);	// th1을 2초동안 잠자게
//			Thread.sleep(2000);	// th1을 2초동안 잠자게
//		} catch(InterruptedException e) {}
// 주석2 end
		System.out.print("<<main 종료>>");
		
	}

}

class ThreadEx8_1 extends Thread {
	public void run() {
		for(int i=0; i < 300; i++) System.out.print("-");
		System.out.print("<<th1 종료>>");
	} // run()
}

class ThreadEx8_2 extends Thread {
	public void run() {
		for(int i=0; i < 300; i++) System.out.print("|");
		System.out.print("<<th2 종료>>");
	} // run()
}

 

결과값 - 주석1처리한 후, 주석2처리한 후

|||||||||||||||||||||||||||||||||||||||||||||<<main 종료>>--|||||||||||||||||||||||||||||||--------------------------------------------------------------------------------|||||||||||||||||||||---------||||||||||||||--------------|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||-|-------------------------------------------------------------------------------------------------------------------------------------------------||||||||||||||||||||||||||||------||||||---------------||||||-----------|||||||||||||---||||||||||||------------||||||||||||||||||||||||||||||||--<<th1 종료>>||||||||||||||||||||||||||||||||<<th2 종료>>

 

결과값 - 주석1처리푼 후 , 주석2처리한 후

-------------------||||||||||||||||||----------------------------------------------------|||||-------------||||||||||||||||||||||----|-|-----------------------------------------------||||||-||------------------------|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||--------------------------------------------------------------------|||-|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||------------------------------------------------||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||----<<th2 종료>>-----------------<<th1 종료>><<main 종료>>

 

결과값 - 주석1처리한 후, 주석2처리푼 후

-----------------------------------------|||||||||||||||||||||||||||||||||||||||||||||||||||||-----------------|-------------------------|--||-|---------------|-------|-|||-|||||||-|--||||||||||-------|-|-|----------------------------------------------------------------------------------------------------------------------------------------------|||||||||||||||||||||||||||||||||||||||||||||||||||||||||-----------------------------------<<th1 종료>>|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||<<th2 종료>>

interrupt()

대기상태(waiting)인 쓰레드를 실행대기 상태(runnable)로 만든다.

 

예제 코드

더보기
import javax.swing.JOptionPane;

public class Try {

	public static void main(String[] args) {

		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
		
	}

}

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("카운트가 종료되었습니다.");
	} 
}

suspend(), resume(), stop()

  • 쓰레드의 실행을 일시정지, 재개, 완전정지 시킨다.

쓰면 편하나 suspend(), resume(), stop()이 deprecated 되었다.

더보기

🤔 why? dead-lock 교착상태때문에

⇒ 우리가 직접 구현(작성)할 수 있다.

 

예제 코드

더보기
import javax.swing.JOptionPane;

public class Try {

	public static void main(String[] args) {

		RunImplEx10 r = new RunImplEx10();
		Thread th1 = new Thread(r, "*");
		Thread th2 = new Thread(r, "**");
		Thread th3 = new Thread(r, "***");
		th1.start();
		th2.start();
		th3.start();

		try {
			Thread.sleep(2000);
			th1.suspend();	// 쓰레드 th1을 잠시 중단시킨다.
			Thread.sleep(2000);
			th2.suspend();
			Thread.sleep(3000);
			th1.resume();	// 쓰레드 th1이 다시 동작하도록 한다.
			Thread.sleep(3000);
			th1.stop();		// 쓰레드 th1을 강제종료시킨다.
			th2.stop();
			Thread.sleep(2000);
			th3.stop();
		} catch (InterruptedException e) {}
		
	}

}

class RunImplEx10 implements Runnable {
	public void run() {
		while(true) {
			System.out.println(Thread.currentThread().getName());
			try {
				Thread.sleep(1000);
			} catch(InterruptedException e) {}
		}
	} // run()
}

⇒ 1줄 출력되고 시간차를 두고 차근차근나온다.

⇒ 별표 순서는 상관없이 출력이 된다.(쓰레드의 특정. os스케쥴러가 관리)


join()

  • 지정된 시간동안 특정 쓰레드가 작업하는 것을 기다린다.
  • 예외처리를 해야 한다.(InterruptedException이 발생하면 작업 재개)

 

예제 코드

더보기
import javax.swing.JOptionPane;

public class Try {

	static long startTime = 0;
	
	public static void main(String[] args) {
		ThreadEx11_1 th1 = new ThreadEx11_1();
		ThreadEx11_2 th2 = new ThreadEx11_2();
		th1.start();
		th2.start();
		startTime = System.currentTimeMillis();

// 주석처리 해보기 start
		try {
			th1.join();	// main쓰레드가 th1의 작업이 끝날 때까지 기다린다.
			th2.join();	// main쓰레드가 th2의 작업이 끝날 때까지 기다린다.
		} catch(InterruptedException e) {}
// 주석처리 해보기 end

		System.out.print("소요시간:" + (System.currentTimeMillis() - Try.startTime));
		
	}

}

class ThreadEx11_1 extends Thread {
	public void run() {
		for(int i=0; i < 300; i++) {
			System.out.print(new String("-"));
		}
	} // run()
}

class ThreadEx11_2 extends Thread {
	public void run() {
		for(int i=0; i < 300; i++) {
			System.out.print(new String("|"));
		}
	} // run()
}

 

결과값1 - ‘주석처리 해보기’ 주석처리하기 전

 

결과값2 - ‘주석처리 해보기’ 주석처리한 후

⇒ 결과값1과2를 비교해보면 소요시간이 출력되는 위치가 다른 것이 확인가능하다.

예제

더보기

⇒ GC 가비지 컬렉터 흉내를 내보았다.

⇒ join()필요[위에코드에서 try문 추가됨.] 


yield()

  • 남은 시간을 다음 쓰레드에게 양보하고, 자신(현재 쓰레드)은 실행대기한다.
  • yield()와 interrupt()를 적절히 사용하면, 응답성과 효율을 높일 수 있다.

 

 

블로그의 정보

Hello 춘기's world

볼빵빵오춘기

활동하기