Список, возвращенный из shutdownNow (), не может быть преобразован в submitted Runnable


Ниже приведен исходный код класса.

Я хотел проверить, как работает shutdownNow() для не представленной задачи. Проблема, которую я получаю ниже кода, это shutdownNow() return List<FutureTask>, а не List<Runnable>, который я представил List<Runnable>, содержащий представленный экземпляр PrimeProducer.

In Below program I wanted to get the tasks which where not executed and their state so that I can reschedule them later. name() represents just state that I want to store.

Таким образом, я не могу преобразовать в представленную задачу.

class PrimeProducer implements Runnable {
private final SynchronousQueue<BigInteger> queue;

PrimeProducer(SynchronousQueue<BigInteger> queue) {
    this.queue = queue;
}

public void run() {
    try {
        BigInteger p = BigInteger.ONE;
        queue.put(p = p.nextProbablePrime());
    } catch (InterruptedException consumed) {
        System.out.println("Safe Exit");
        Thread.currentThread().interrupt();
    }

}

public String name() {
    return "PrimeProducer";
}

public static void main(String[] args) throws InterruptedException,
        ExecutionException {
    PrimeProducer primeProducer = new PrimeProducer(
            new SynchronousQueue<BigInteger>());//SynchronousQueue just to ensure it put is blocking
    ExecutorService executorService = Executors.newFixedThreadPool(1);
    executorService.submit(primeProducer);
    executorService.submit(primeProducer);
    List<Runnable> list = executorService.shutdownNow();
    //PrimeProducer producer = (PrimeProducer) list.get(0);// Class Cast
                                                            // Exception
    FutureTask<PrimeProducer> futureTask = (FutureTask<PrimeProducer>) list
            .get(0);
            System.out.println(futureTask.isDone());//Prints false
    futureTask.get().name();//futureTask-->PrimeProducer get() hangs.


}
}

Проблемные Линии

//PrimeProducer producer = (PrimeProducer) list.get(0);// Class Cast
                                                            // Exception
 FutureTask<PrimeProducer> futureTask = (FutureTask<PrimeProducer>) list
            .get(0);
 futureTask.get().name();//futureTask-->PrimeProducer get() hangs.
2 3

2 ответа:

Попробуйте "выполнить" вместо "отправить".

Такое поведение происходит потому, что есть разница между тем, как execute и submit обрабатывает задачи, которые передаются.

execute метод непосредственно использует Runnable command, который передается ему, где как submit создать RunnableFuture и вызвать execute

 RunnableFuture<Object> ftask = newTaskFor(task, null);