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