我对 Java 中的 Future.get() 有一个奇怪的问题。它总是返回一个InterruptedException,但是奇怪的是异常的原因是null,所以我不知道是谁打断了我..
情况变得更糟,因为我在调用 get() 之前进行了检查,而 Future 必须做的工作已经完成。
这是负责下面输出的代码。f 是 Future,并且可调用返回一个 HashMap ,其中 Agent 并不真正相关。抱歉,如果打印行太多,我只是想提供尽可能多的信息。callable 的 call 方法现在很简单System.out.println("Hola soy agente")
,正如您将看到的,它被打印出来,这意味着 callable 也没有导致异常
这是代码:
try
{
System.out.println(f.isDone()); //true
System.out.println(f.isCancelled()); //false
System.out.println(f.toString()); //FutureTask
newModdedAgents.putAll(f.get());
}catch(InterruptedException e)
{
System.out.println(f.isDone()); //true
System.out.println(f.isCancelled()); //false
System.err.println(e); //It is an interruptedException
System.err.println(e.getCause()); //???? null?
e.printStackTrace();
}
和输出
Hola soy agente
true
false
java.util.concurrent.FutureTask@1c4c94e5
true
false
java.lang.InterruptedException
null
java.lang.InterruptedException
at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireSharedInterruptibly(AbstractQueuedSynchronizer.java:1302)
at java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.java:248)
at java.util.concurrent.FutureTask.get(FutureTask.java:111)
at com.pf.simulator.Simulation.simulateStep(Simulation.java:217)
at com.pf.gui.ButtonPanel.doWork(ButtonPanel.java:141)
at com.pf.gui.ButtonPanel$1$1.construct(ButtonPanel.java:198)
at com.pf.gui.SwingWorker$2.run(SwingWorker.java:117)
at java.lang.Thread.run(Thread.java:636)
如果您想查看我将可调用对象添加到线程池的位置...那么这就是它的代码
for(Callable<HashMap<Integer, Agent>> c : agentCallables)
{
Future<HashMap<Integer,Agent>> future = pool.submit(c);
agentFutureSet.add(future);
}
然后我用
for(Future<HashMap<Integer, Agent>> f : agentFutureSet)
try
{
//Here goes the code at the beginning