Вы спросили : «Но это не работает. Почему?»
Я отвечу : Ваше решение не работает, потому что вы всегда работаете в л oop внутри runUserAction
. Вы никогда не выйдете из этого l oop, чтобы проверить, не приостановлены ли вы.
Боюсь, вам придется переделывать ваше решение для запуска usrAction в более коротких циклах, в противном случае вы либо потеряете состояние (при условии вы прерываете это l oop извне), что приведет к неопределенному поведению, ИЛИ вы выйдете из него только по окончании ИЛИ приостановите свой l oop в состояниях, которые вы на самом деле не хотите сделать паузу в [например, во время сетевого вызова - после возобновления вы получите исключение SocketTimeoutException].
Я бы предложил вам go с прежним подходом, поскольку он более элегантен.
Редактировать:
Еще одно возможное решение: каждая итерация внутри проверки usrAction для состояния PausableThread, т. Е. Посмотреть, приостановлено ли оно, остановлено или что-то еще.
Попробуйте это:
PausableRunnable. java
public synchronized boolean canContinue() throws Exception {
synchronized (lockerObject) {
if (isPaused) {
lockerObject.wait();
}
if (isFinished) {
return false;
}
return true;
}
}
PausableThread. java
public boolean canContinue() throws Exception {
return runnable.canContinue();
}
и приложение. java
private void initThread() {
Runnable r = () -> {
try {
while (totalRunTime > 0) {
if (bgThread.canContinue()) { // <--- !!!!!!
Thread.sleep(200);
totalRunTime--;
updateUi();
}
}
}
catch (Exception e) { e.printStackTrace(); }
};
bgThread = new PausibleThread(r);
}
Таким образом, вы можете запустить ваше приложение Runnable и по-прежнему подчиняться PausableThread Состояния в то время, когда работоспособный может получить толчок. Т.е. до / после транзакции или другой части расчета, которая не должна прерываться.
Редактировать 2:
не стесняйтесь терять модификатор «synchronized» в таких методах, как пауза или возобновление, так как вы уже работают внутри синхронизированных блоков в них.