Java | Thread 실행제어

나경호·2023년 1월 9일
0

CS | Java

목록 보기
9/9

sleep()

  • static 메서드로서 현재 자기 자신의 쓰레드를 지정된 시간동안 멈추게 한다.
static void sleep(long millis)
static void sleep(long millis, int nanos)
  • 예외처리를해야한다.(InterruptedException이 발생하면 깨어남)
try{
	Thread. sleep (1, 500000); // 쓰레드를0.0015초동안멈추게한다.
} catch (InterruptedException e) ()
  • 메서드를 만들어서 많이 사용한다.
void delay(long millis) {
	try {
    	Thread.sleep(millis);
    } catch(InterruptedException e) {}
}

interrupt()

  • 대기상태(WAITING)인 쓰레드를 실행대기상태(RUNNABLE)로 만든다.
    void interrupt () 쓰레드의 interrupted상태를 false에서 true로 변경.
    boolean isInterrupted() 쓰레드의 interrupted상태를 반환.
    static boolean interrupted() 현재쓰레드의 interrupted상태를 알려주고, false로초기화
public static void main (String[] args) {
	ThreadEx13_2 th1 = new ThreadEx13_2();
	th1.start();
	th1.interrupt(); //interrupt()를 호출하면,interrupted 상태가 true가된다.
		...
	System.out.println ("isInterrupted():"+ th1.isInterrupted()); // true
}

suspend(), resume(), stop()

  • 쓰레드의 실행을 일시정지, 재개, 완전정지 시킨다.
    void suspend() 쓰레드를 일시정지 시킨다.
    void resume() suspend()에 의해 일시정지된 쓰레드를실 행대기상태로 만든다.
    void stop() 쓰레드를 즉시 종료 시킨다.

-> dead-lock 우려로 인해 사용을 권장하지 않음.

class ThreadEx17 implements Runnable {
	boolean suspended = false;
	boolean stopped = false;

	public void run() {
		while (!stopped)
			if (!suspended) (
				/*쓰레드가수행할코드를작성*/
			}
        }
    }
	
    public void suspend() { suspended = true; }
    public void resume() { suspended = false; }
    public void stop() { stopped = true; }

join

  • 지정된 시간동안 특정 쓰레드가 작업하는 것을 기다린다.
    void join() // 작업이 모두 끝날 때까지
    void join(long millis) // 천분의 일초 동안
    void join (long millis, int nanos) // 천분의 일초 + 나노초 동안

  • 예외처리를 해야 한다.(InterruptedException이 발생하면 작업 재개)

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                                 

yield()

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

	Thread th;

	MyThreadEx18(String name) {
		th = new Thread(this, name);
	}
	public void run () {
		while (!stopped) {
			if (!suspended) {
              /*
                  작업수행
              */
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {}
            
        	} else {
            	Thread.yield(); // OS 스케줄러에게 통보하는 것이기 때문에 크게 다르지 않을 수 있음.
            } 
        }
    }
}

public void start() { th.start(); }
public void suspend() { 
	suspended = true;
    th.interrupt();
}
public void resume() { suspended = false; }
public void stop() { 
	stopped = true;
    th.interrupt();
}
    

Reference

profile
기억창고👩‍🌾

0개의 댓글