나는 최근에 여기에 PauseableThread를 올렸습니다.
ReadWriteLock
을 사용하여 일시 중지를 구현할 수 있습니다. 잠시 멈출 기회가 생길 때마다 쓰기 잠금을 잠깐 잡아 당기면 멈춤을 위해 읽기 잠금을 잡기 위해 멈춤이 필요합니다.
// The lock.
private final ReadWriteLock pause = new ReentrantReadWriteLock();
// Block if pause has been called without a matching resume.
private void blockIfPaused() throws InterruptedException {
try {
// Grab a write lock. Will block if a read lock has been taken.
pause.writeLock().lockInterruptibly();
} finally {
// Release the lock immediately to avoid blocking when pause is called.
pause.writeLock().unlock();
}
}
// Pause the work. NB: MUST be balanced by a resume.
public void pause() {
// We can wait for a lock here.
pause.readLock().lock();
}
// Resume the work. NB: MUST be balanced by a pause.
public void resume() {
// Release the lock.
pause.readLock().unlock();
}
classify() 호출이 결과를 저장하거나 적절한 검사 점에서 주기적으로 콜백하지 않으면 실행을 일시 중지하려고 할 수 없습니다 (예 : '일시 중지'플래그를 확인하고, 설정되어있는 경우 '일시 중지'이벤트를 알린 다음 '다시 시작'이벤트를 기다립니다. –
@ Martin James - 나는 너와 정말로 동의하지 않는다. 물론 스레드를 일시 중지하거나 심지어 ckeck-points 또는 플래그와 같은 것을 사용하지 않고 완전히 중지 할 수 있습니다. 이것이 좋은 아이디어인지 아닌지는 또 다른 질문이지만 적절한 생각 일 수 있습니다. 내 말은, 디버거가 비슷한 것을하고 있다는 것입니다. 어딘가에서 멈추고 모든 변수를 볼 수 있습니다. 얼마나 오래 전, 각 반복 후에 저장소를 호출하고 표시하는 것이 좋은 접근 방법이라는 점에 동의합니다. –
@ThomasUhrig - 당신 말이 맞습니다. 나는 시스템 리소스에 대한 명시 적 또는 암시 적 잠금을 유지하는 동안 스레드를 일시 중지/중단하는 '문제점'을 건너 뛰었습니다. 디버거와 완전한 프로세스 종료는 제쳐두고 OP는 호출 외부에서 일부 루프를 액세스 할 수 있어야합니다. 일부 외부 루프는 데이터가 불완전하게 처리되지만 '유효'상태입니다. –