1

가능한 중복 :
Start/Suspend/Resume/Suspend … a method invoked by other class시작/자바 이력서/방법을 일시 중단

내가 언제 K-NN 분류기를 구현하고자하지만 난 "는 전화를 할 수있는 방법을 찾을 수 없습니다 특정 시간 동안 분류 (...) "메소드를 일시 중단하고, 일시 중단하고, 메소드가 일시 중단되기 전에 사용 가능한 결과를 얻고, 특정 시간 동안 메소드를 재개하고, 일시 중단하고, 메소드가 일시 중단되기 전에 사용 가능한 결과를 얻습니다 등등 ...

미리 감사드립니다!

+0

classify() 호출이 결과를 저장하거나 적절한 검사 점에서 주기적으로 콜백하지 않으면 실행을 일시 중지하려고 할 수 없습니다 (예 : '일시 중지'플래그를 확인하고, 설정되어있는 경우 '일시 중지'이벤트를 알린 다음 '다시 시작'이벤트를 기다립니다. –

+0

@ Martin James - 나는 너와 정말로 동의하지 않는다. 물론 스레드를 일시 중지하거나 심지어 ckeck-points 또는 플래그와 같은 것을 사용하지 않고 완전히 중지 할 수 있습니다. 이것이 좋은 아이디어인지 아닌지는 또 다른 질문이지만 적절한 생각 일 수 있습니다. 내 말은, 디버거가 비슷한 것을하고 있다는 것입니다. 어딘가에서 멈추고 모든 변수를 볼 수 있습니다. 얼마나 오래 전, 각 반복 후에 저장소를 호출하고 표시하는 것이 좋은 접근 방법이라는 점에 동의합니다. –

+0

@ThomasUhrig - 당신 말이 맞습니다. 나는 시스템 리소스에 대한 명시 적 또는 암시 적 잠금을 유지하는 동안 스레드를 일시 중지/중단하는 '문제점'을 건너 뛰었습니다. 디버거와 완전한 프로세스 종료는 제쳐두고 OP는 호출 외부에서 일부 루프를 액세스 할 수 있어야합니다. 일부 외부 루프는 데이터가 불완전하게 처리되지만 '유효'상태입니다. –

답변

0

나는 최근에 여기에 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(); 
    }