본문 바로가기

명사 美 비격식 (무리 중에서) 아주 뛰어난[눈에 띄는] 사람[것]

JAVA

스레드의 스케줄링/실행제어, 스레드의 상태를 지정하다.

스레드의 실행제어

스레드 프로그래밍은 어렵다.

동기화, 스케줄링때문인데

앞서 우선순위를 통해 스레드간의 스케줄링을 하는 방법이 있었으나, 한참 부족하다.

https://standout.tistory.com/1422

 

스레드의 우선순위 setPriority()

앞서 스레드를 생성하여 start해 봤다. https://standout.tistory.com/1421 스레드 구현과 실행 + 싱글쓰레드와 멀티쓰레드: start()와 run() 앞서 스레드에 대해 알아봤다. 프로세스는 공장이라면 스레드는 일

standout.tistory.com

 

 

스레드의 스케줄링과 관련된 메서드는 다음과 같다.

static void sleep(long millis)

현재 실행 중인 스레드를 주어진 시간(밀리초) 동안 일시 정지시킵니다.

Thread thread = new Thread(() -> {
    try {
        System.out.println("Thread is going to sleep.");
        Thread.sleep(2000); // 2초 동안 스레드 일시 정지
        System.out.println("Thread woke up.");
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
});

thread.start();

 

 

static void sleep(long millis, int  nanos)

현재 실행 중인 스레드를 주어진 시간(밀리초)과 나노초 단위로 일시 정지시킵니다.

Thread thread = new Thread(() -> {
    try {
        System.out.println("Thread is going to sleep.");
        Thread.sleep(2, 500000); // 2초 500밀리초 동안 스레드 일시 정지
        System.out.println("Thread woke up.");
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
});

thread.start();

 

void join()

현재 실행 중인 스레드가 호출한 스레드가 종료될 때까지 기다립니다.

Thread thread = new Thread(() -> {
    System.out.println("Child thread started.");
    try {
        Thread.sleep(2000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    System.out.println("Child thread finished.");
});

thread.start();

try {
    thread.join(); // 호출한 스레드가 종료될 때까지 기다립니다.
} catch (InterruptedException e) {
    e.printStackTrace();
}

System.out.println("Main thread exiting.");

 

void join(long millis)

현재 실행 중인 스레드가 호출한 스레드가 종료되거나 주어진 시간(밀리초)이 경과할 때까지 기다립니다.

Thread thread = new Thread(() -> {
    System.out.println("Child thread started.");
    try {
        Thread.sleep(2000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    System.out.println("Child thread finished.");
});

thread.start();

try {
    thread.join(3000); // 호출한 스레드가 종료되거나 3초 후에는 기다리지 않고 다음으로 넘어갑니다.
} catch (InterruptedException e) {
    e.printStackTrace();
}

System.out.println("Main thread exiting.");

 

void join( long millis, int nanos)

현재 실행 중인 스레드가 호출한 스레드가 종료되거나 주어진 시간(밀리초)과 나노초 단위로 지정된 시간이 경과할 때까지 기다립니다.

Thread thread = new Thread(() -> {
    System.out.println("Child thread started.");
    try {
        Thread.sleep(2000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    System.out.println("Child thread finished.");
});

thread.start();

try {
    thread.join(3, 500000); // 호출한 스레드가 종료되거나 3초 500밀리초 후에는 기다리지 않고 다음으로 넘어갑니다.
} catch (InterruptedException e) {
    e.printStackTrace();
}

System.out.println("Main thread exiting.");

 

 

void interrupt()

스레드를 인터럽트하여 스레드의 작업을 중단시킵니다.

Thread thread = new Thread(() -> {
    while (!Thread.currentThread().isInterrupted()) {
        // 스레드의 작업 수행
    }
});

thread.start();

// 일정 시간 후에 스레드를 인터럽트합니다.
try {
    Thread.sleep(5000);
    thread.interrupt();
} catch (InterruptedException e) {
    e.printStackTrace();
}

 

void stop()

 스레드를 즉시 중단시킵니다. (비권장 메서드이며, deprecated 되었습니다.)

Thread thread = new Thread(() -> {
    try {
        Thread.sleep(5000); // 5초 동안 스레드 실행
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
});

thread.start();

// 2초 후에 스레드를 중단합니다.
try {
    Thread.sleep(2000);
    thread.stop(); // 스레드를 즉시 중단
} catch (InterruptedException e) {
    e.printStackTrace();
}

 

void suspend()

스레드를 일시 정지시킵니다. (비권장 메서드이며, deprecated 되었습니다.)

Thread thread = new Thread(() -> {
    while (true) {
        System.out.println("Thread is running...");
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
});

thread.start();

// 3초 후에 스레드를 일시 정지합니다.
try {
    Thread.sleep(3000);
    thread.suspend(); // 스레드를 일시 정지
    System.out.println("Thread suspended.");
} catch (InterruptedException e) {
    e.printStackTrace();
}

 

void resume()

중지된 스레드를 다시 실행시킵니다. (비권장 메서드이며, deprecated 되었습니다.)

Thread thread = new Thread(() -> {
    while (true) {
        System.out.println("Thread is running...");
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
});

thread.start();

// 3초 후에 스레드를 일시 정지합니다.
try {
    Thread.sleep(3000);
    thread.suspend(); // 스레드를 일시 정지
    System.out.println("Thread suspended.");
} catch (InterruptedException e) {
    e.printStackTrace();
}

// 3초 후에 스레드를 다시 실행합니다.
try {
    Thread.sleep(3000);
    thread.resume(); // 스레드를 다시 실행
    System.out.println("Thread resumed.");
} catch (InterruptedException e) {
    e.printStackTrace();
}

 

static void yield()

현재 실행 중인 스레드가 다른 스레드에게 실행을 양보하고, 스레드 스케줄러에게 이를 통보합니다. 스레드 스케줄러는 이에 따라 다른 스레드를 실행시킬 수 있습니다.

Thread thread1 = new Thread(() -> {
    for (int i = 0; i < 5; i++) {
        System.out.println("Thread 1 executing step " + i);
        Thread.yield(); // 다른 스레드에게 실행 양보
    }
});

Thread thread2 = new Thread(() -> {
    for (int i = 0; i < 5; i++) {
        System.out.println("Thread 2 executing step " + i);
        Thread.yield(); // 다른 스레드에게 실행 양보
    }
});

thread1.start();
thread2.start();

 

 

 

 

이렇게 변경된 스레드의 상태는 getState로 확인할 수 있다.

https://standout.tistory.com/1426

 

getState(), 스레드의 상태 확인하기

스레드의 상태는 getState()메서드를 통해 확인할 수 있다. NEW 스레드가 생성됨. start()가 호출되지않은 상태 RUNNABLE 실행 중 또는 실행가능한 상태 BLOCKED 동기화블럭에의 의해 일시정지된 상태 WAITIN

standout.tistory.com