2014-06-08 10 views
0

다른 게시물을 읽었지만 정확한 답변을 찾지 못해 누군가가 약간의 설명을 줄 수 있기를 바랍니다.자바 웨이크 슬리핑 스레드

나는 얼마 동안 실행할 프로그램이 있습니다. 나는 여러 가지 작업을 수행하는 뒷 배경에서 실행되는 일부 스레드를 가지고 있으며, 스레드를 3 가지 생각할 수 있도록 간단하게 유지합니다. ThreadA은 매 10 초마다 작업을 수행합니다. ThreadB은 30 초마다 작업을 수행하고 ThreadC은 5 분마다 작업을 수행합니다.

나는 바쁜 대기를 사용하지 않고 지정된 시간 동안 스레드를 잠자기 상태로 만듭니다.

제 질문은 완전히 종료 된 것입니다. 변수마다 스레드마다 읽기 액세스 권한이 있으므로 사용자가 프로그램 종료를 알 수 있습니다. 다음에 쓰레드가 활성화 될 때, 그들은 루프를 빠져 나와 결합하고 모두 좋다. ThreadC는 매 5 분마다 깨어납니다.

내가 가진 질문은 잠자기 시간이 끝나기 전에 잠자기 시간에 일어나 깨어나서 신호 할 수 있습니까? 이것이 가능하지 않다면 wait()notify()을 사용하도록 코드를 재 작성해야합니까, 아니면 더 좋은 방법이 있습니까?

답변

4

Thread.sleep 스레드가 수면 중에 인터럽트되면 InterruptedException이 throw됩니다. 그것을 잡아서 깃발을 확인하십시오.

2

당신은 당신의 스레드에서 interrupt() 메서드를 호출 할 수 있습니다 당신의 스레드가 block state에서 running state로 이동하게됩니다,하지만 InterruptedException입니다 예외가 발생합니다 다음

또한 catch 블록의 종료 스레드를 할 수 있습니다으로하는

: 다른 솔루션은 당신이 block state

예에 스레드를주지 않고 지정된 특정 시간에 실행 메소드를 호출 타이머 작업을 사용할 수 있다는 것입니다

public class TimerBomb { Toolkit toolkit; Timer timer; int count = 0; public TimerBomb(int seconds) { toolkit = Toolkit.getDefaultToolkit(); timer = new Timer(); timer.schedule(new RemindTask(), seconds * 1000, seconds*1000); } class RemindTask extends TimerTask { public void run() { //do stuff here } } public static void main(String args[]) { System.out.println("About to schedule task."); Thread t = new Thread(new Runnable() { @Override public void run() { new TimerBomb(5); } }); t.start(); System.out.println("Task scheduled."); } } 

영원히 5 초마다 실행됩니다.

3

스레드가 Thread.sleep(...)으로 대기 상태 인 경우 Thread.interrupt()으로 깨울 수 있습니다. InterruptedException을 처리하고 루프에서 Thread.currentThread().isInterrupted()을 테스트해야합니다.

0

ExecutorService와 shutdownNow() 메서드 (일반적으로 모든 활성 스레드를 중단 함)를 조사해야합니다. 당신은 스케줄링 휠을 재창조한다고 느낍니다.

0

다른 답변은 실제로 묻는 질문에 대한 좋은 답변이지만 아무도 에 질문해야하는 질문에 대한 최상의 답변을 제공하지 못합니다. 문제는 다른 기간으로 반복되어야하는 여러 주기적 작업을 예약하는 가장 좋은 방법은 무엇입니까? 대답은 java.util.concurrent.ScheduledExecutorService를 사용하는 것입니다.

ExeuctorServices와 마찬가지로 모든 작업을 중지하려는 경우 shutdown() 및 shutdownNow() 메서드를 제공합니다.