Список, возвращенный из 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 ответа:
Такое поведение происходит потому, что есть разница между тем, как
execute
иsubmit
обрабатывает задачи, которые передаются.
execute
метод непосредственно используетRunnable command
, который передается ему, где какsubmit
создатьRunnableFuture
и вызватьexecute
RunnableFuture<Object> ftask = newTaskFor(task, null);