Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 列表<;可运行>;从Shutdownow()返回的无法转换为已提交的Runnable_Java_Shutdown_Java.util.concurrent - Fatal编程技术网

Java 列表<;可运行>;从Shutdownow()返回的无法转换为已提交的Runnable

Java 列表<;可运行>;从Shutdownow()返回的无法转换为已提交的Runnable,java,shutdown,java.util.concurrent,Java,Shutdown,Java.util.concurrent,下面是该类的源代码 我想验证shutdownNow()如何处理未提交的任务。我在下面代码中遇到的问题是shutdownNow()returnList,而不是List,我已提交List,其中包含提交的PrimeProducer实例 在下面的程序中,我想获得未执行的任务及其状态,以便以后重新安排它们。name()仅表示我要存储的状态。 因此,我无法转换为提交的任务 class PrimeProducer implements Runnable { private final SynchronousQ

下面是该类的源代码

我想验证
shutdownNow()
如何处理未提交的任务。我在下面代码中遇到的问题是
shutdownNow()
return
List
,而不是
List
,我已提交
List
,其中包含提交的
PrimeProducer
实例

在下面的程序中,我想获得未执行的任务及其状态,以便以后重新安排它们。name()仅表示我要存储的状态。

因此,我无法转换为提交的任务

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实现可运行{
私有最终同步队列;
PrimeProducer(同步队列){
this.queue=队列;
}
公开募捐{
试一试{
BigInteger p=BigInteger.1;
put(p=p.nextProbablePrime());
}捕获(中断异常消耗){
系统输出打印项次(“安全出口”);
Thread.currentThread().interrupt();
}
}
公共字符串名称(){
返回“PrimeProducer”;
}
公共静态void main(字符串[]args)抛出InterruptedException,
执行例外{
PrimeProducer PrimeProducer=新PrimeProducer(
new SynchronousQueue());//SynchronousQueue只是为了确保它被阻塞
ExecutorService ExecutorService=Executors.newFixedThreadPool(1);
执行服务提交(primeProducer);
执行服务提交(primeProducer);
List List=executorService.shutdownNow();
//PrimeProducer=(PrimeProducer)list.get(0);//类强制转换
//例外情况
FutureTask FutureTask=(FutureTask)列表
.get(0);
System.out.println(futureTask.isDone());//打印错误
futureTask.get().name();//futureTask-->PrimeProducer get()挂起。
}
}
问题行

//PrimeProducer producer = (PrimeProducer) list.get(0);// Class Cast
                                                            // Exception
 FutureTask<PrimeProducer> futureTask = (FutureTask<PrimeProducer>) list
            .get(0);
 futureTask.get().name();//futureTask-->PrimeProducer get() hangs.
//PrimeProducer=(PrimeProducer)list.get(0);//班级演员
//例外情况
FutureTask FutureTask=(FutureTask)列表
.get(0);
futureTask.get().name()//futureTask-->PrimeProducer get()挂起。

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

发生这种行为是因为
执行
提交
处理提交任务的方式不同

execute
方法直接使用
Runnable命令
,该命令作为
submit
create
RunnableFuture
并调用
execute

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

我会先检查
isDone()
,因为我怀疑
shutdownNow()
返回的所有任务永远不会运行,也永远不会被设置。Peter更快:)另外:我会始终空值检查get()的结果。@PeterLawrey isDone()为false。在当前的程序中,我知道总会有一个线程被遗漏,所以我做了一些假设。我仍然不明白,你们到底想在这里做什么。。。这仅仅是一个实验来检验关机的作用吗?非常清楚。您确定列表中只包含一个
Runnable
?我相信您会得到一个
ClassCastException
,因为列表中的第一个
Runnable
不是
PrimeProducer
(顺便说一句
FutureTask
Runnable
,因为前者实现后者)。