Я просто изучал пакет java.util.concurrent.Утилита Future.cancel (boolean) method
я узнал, что класс «Future» имеет метод булево отменить (булево 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;
}
}
Intially, я предположил, что отмена задачи также остановит выполнение бегущей нити (часть «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, было сказано, что
- «Отменить» метод может только остановить «Не начато» рабочих мест (что противоречит описанию апи метода)
- метод отмены просто прерывает текущую нить, которая затем должен вернуться из метода Run()
Таким образом, я включил «АЙ» часть - проверка петли во время прерывания, выход следующим образом:
Task completed ? false
counter = 10
Task cancelled ? true
Is task cancelled ? true
ВОПРОС:
Если один должен написать что-то аналогичное к части «OUCH», чтобы остановить выполняемый поток, какова утилита/значение метода отмены. Как обертывание Callable в FutureTask помогает, если Thread нельзя остановить, отменив? Какая проектная/концептуальная/логическая часть, которую я пропускаю?
Я столкнулся с той же проблемой. Я не знал, почему мои пулы потоков истощаются в определенный момент. Теперь я понял, почему. Благодарю. – tejas