스레드의 실행제어
스레드 프로그래밍은 어렵다.
동기화, 스케줄링때문인데
앞서 우선순위를 통해 스레드간의 스케줄링을 하는 방법이 있었으나, 한참 부족하다.
https://standout.tistory.com/1422
스레드의 스케줄링과 관련된 메서드는 다음과 같다.
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
'JAVA' 카테고리의 다른 글
synchronized 동기화를 보완하다, wait()과 notify() 락을 가진 상태로 오랜시간 유지하지않도록 (0) | 2024.02.26 |
---|---|
synchronized 를 이용한 스레드의 동기화 (0) | 2024.02.26 |
getState(), 스레드의 상태 확인하기 (0) | 2024.02.26 |
로그 파일을 주기적으로 청소하기, 데몬 스레드의 구현과 실행 (0) | 2024.02.26 |
보안상의 이유로 도입된 스레드 그룹: 서로 관련된 스레드를 그룹으로! (0) | 2024.02.26 |