Ensure that a task is interruptible

2019-02-25 17:20发布

How to ensure that my tasks are responsive to interruption when I call Future.cancel()?

ExecutorService executor = Executors.newSingleThreadExecutor();
Future<Boolean> future = executor.submit(task);

try {
    future.get(timeout, timeoutUnit);
} catch (TimeoutException e) {
    future.cancel(true);
}

2条回答
乱世女痞
2楼-- · 2019-02-25 18:13

In your task Runnable, make sure at different levels where you do a interrupt check. Something like:

while(!Thread.currentThread().isInterrupted()){
    //do something
}

If your logic in not something like loop, then check for interrupt status right before major computation like database or web-service call.

The idea here is to keep checking interrupt status as when future.cancel(true) is called, it ultimately interrupts your thread running task. This is kind of a way to know when to terminate.

查看更多
相关推荐>>
3楼-- · 2019-02-25 18:20

How to ensure that my tasks are responsive to interruption when I call Future.cancel()?

Calling future.cancel(...) will stop the task it has not been run yet. If it is being run then if you use future.cancel(true) it will interrupt the running thread.

To stop the thread you need to test the thread interrupt flag:

if (!Thread.currentThread().isInterrupted()) {
   ...

And you need to handle handle InterruptedException appropriately. For example:

try {
    Thread.sleep(...);
} catch (InterruptedException e) {
    // re-establish the interrupt condition
    Thread.currentThread.interrupt();
    // probably stop the thread
    return;
}

See my answer about threads not interrupting.

查看更多
登录 后发表回答