从shutdownNow()返回的List <runnable>无法转换为提交的Runnable </runnable>

时间:2012-09-19 11:04:14

标签: java shutdown java.util.concurrent

以下是该类的源代码。

我想验证shutdownNow()如何处理未提交的任务。我在下面的代码中遇到的问题是shutdownNow()返回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 个答案:

答案 0 :(得分:2)

尝试“执行”而不是“提交”。

答案 1 :(得分:0)

出现这种情况是因为executesubmit处理提交的任务的方式不同。

execute方法直接使用Runnable command传递给submitRunnableFuture创建execute并调用 RunnableFuture<Object> ftask = newTaskFor(task, null);

{{1}}