Утилита Future.cancel (логический) метод

Я просто изучал пакет java.util.concurrent.

Я узнал, что классБудущееесть методлогическое отмена (логическое mayInterruptIfRunning)

Пожалуйста, найдите прикрепленный тестовый код, который я написал:

package com.java.util.concurrent;

import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.ScheduledThreadPoolExecutor;

public class FutureTester {

/**
 * @param args
 * @throws InterruptedException
 */
public static void main(String[] args) throws InterruptedException {
    // TODO Auto-generated method stub
    int poolCnt = 1;
    Callable<NumberPrinter> numberPrinter = null;
    ScheduledThreadPoolExecutor schPool = new ScheduledThreadPoolExecutor(
            poolCnt);
    ScheduledFuture<NumberPrinter>[] numPrinterFutures = new ScheduledFuture[poolCnt];
    FutureTask<NumberPrinter>[] futureTask = new FutureTask[poolCnt];

    for (int i = 0; i < poolCnt; i++) {
        numberPrinter = new NumberPrinter();
        futureTask[i] = new FutureTask<NumberPrinter>(numberPrinter);

        /*
         * numPrinterFutures[i] = (ScheduledFuture<NumberPrinter>) schPool
         * .schedule(futureTask[i], 0, TimeUnit.MILLISECONDS);
         */
        numPrinterFutures[i] = (ScheduledFuture<NumberPrinter>) schPool
                .submit(futureTask[i]);
    }

    //Thread.sleep(30);

    if (numPrinterFutures.length > 0) {

        System.out.println("Task completed ? "
                + numPrinterFutures[0].isDone());

        System.out.println("Task cancelled ? "
                + numPrinterFutures[0].cancel(true));

        System.out.println("Is task cancelled ? "
                + numPrinterFutures[0].isCancelled());
    }
}

}

class NumberPrinter implements Callable<NumberPrinter> {

private int counter = 10;

@Override
public NumberPrinter call() throws Exception {
    // TODO Auto-generated method stub

    while (counter > 0) {
        if (Thread.interrupted()) {/*OUCH !!!*/
            return null;
        }
        System.out.println("counter = " + (counter--));
    }

    return this;
}

}

По сути, я предполагал, что отмена задачи также остановит выполнение работающего потока (часть "OUCH" НЕ включена). Но я получил вывод следующим образом:

counter = 10
Task completed ? false
counter = 9
Task cancelled ? true
counter = 8
Is task cancelled ? true
counter = 7
counter = 6
counter = 5
counter = 4
counter = 3
counter = 2
counter = 1

При дальнейшем чтении самого stackoverflow было сказано, что

Метод «cancel» может остановить только «незапущенные» задания (что противоречит API-описанию метода)Метод cancel просто прерывает работающий поток, который затем должен вернуться из метода run ()

Следовательно, я включил часть «OUCH» - цикл while для проверки прерывания; вывод был следующим:

Task completed ? false
counter = 10
Task cancelled ? true
Is task cancelled ? true

ВОПРОС:

Если предполагается написать что-то аналогичное части 'OUCH', чтобы остановить работающий поток, какова полезность / значение метода cancel. Как помогает оборачивание Callable в FutureTask, если поток не может быть остановлен отменой? Что такое дизайн / концептуальная / логическая часть, которую я пропускаю?

Ответы на вопрос(4)

Ваш ответ на вопрос