I posted a PauseableThread on here recently.
You can implement a pause using a ReadWriteLock
. If you momentarily grab a write lock on it every time you hit an opportunity to pause then you just need the pauser to grab a read lock to pause you.
// 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();
}