我在 Java 中的 Future.get() 遇到了一个奇怪的问题。它总是返回一个 InterruptedException,但奇怪的是异常的原因是 null,所以我不知道是谁打断了我。
情况变得更糟,因为我在调用 get() 之前进行检查,而 Future 要做的工作已经完成。
这是负责下面输出的代码。f 是未来,并且可调用返回一个 HashMap,其中 Agent 并不真正相关。抱歉,如果打印行太多,我只是想提供尽可能多的信息。 callable 的调用方法现在是一个简单的System.out.println("Hola soy agente")
正如您将看到的那样,它被打印出来,这意味着可调用对象也没有导致异常
这是代码:
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