完成的未来未取消但已完成

时间:2020-08-25 12:16:08

标签: java multithreading

我有以下Runnable

task = () -> {
    while(true) {
        loopPreparation();

        _chunkRxTask = receiveChunk(); /*completable future */

        try {
            _chunkRxTask.get();
        }catch (ExecutionException | InterruptedException e) {
            break;
        }
    }
};

我是这样开始的:

_asyncTask = CompletableFuture.runAsync(task);

然后我想通过

完成它
if ( _asyncTask != null ) {
    _asyncTask.cancel(true);
    _asyncTask = null;
}

我看到了_asyncTask.isDone() == true,但是它的循环继续运行。如何正确停止?我是否总是需要停止内部_chunkRxTask

1 个答案:

答案 0 :(得分:0)

我的问题的最终解决方案如下:

if ( _asyncTask != null ) {
    if ( _chunkRxTask != null ) {
        _chunkRxTask.cancel(true);
        _chunkRxTask = null;
    }

    _asyncTask.join();
    _asyncTask = null;
}

并停止此活动:

let endTime = 0;
let timer;

function startGame() {
  endTime = moment().add(3, 'minutes'); // Current time + 3 minutes
  console.log('game started at', moment.now())
}

function renderTimer() {
  // This goes on the client side
  clearInterval(timer); // If you hit start game again you need to clear the loop
  timer = setInterval(function(){  $('#h1').text(moment(moment(endTime).diff(moment())).format('mm:ss')); }, 1000);
}