Java Future.get()总是被InterruptedException中断
我对Java中的Future.get()有一个奇怪的问题。它总是以InterruptedException返回,然而奇怪的是,异常的原因是空的,所以我不知道是谁打断了我 更糟糕的是,我在调用get()之前进行了检查,而将来要做的工作已经完成了 下面是负责以下输出的代码f是未来,可调用函数返回一个HashMap,其中代理并不真正相关。对不起,如果有太多的打印行,我只是想给尽可能多的信息。callable中的call方法目前是一个简单的Java Future.get()总是被InterruptedException中断,java,null,get,future,interrupted-exception,Java,Null,Get,Future,Interrupted Exception,我对Java中的Future.get()有一个奇怪的问题。它总是以InterruptedException返回,然而奇怪的是,异常的原因是空的,所以我不知道是谁打断了我 更糟糕的是,我在调用get()之前进行了检查,而将来要做的工作已经完成了 下面是负责以下输出的代码f是未来,可调用函数返回一个HashMap,其中代理并不真正相关。对不起,如果有太多的打印行,我只是想给尽可能多的信息。callable中的call方法目前是一个简单的System.out.println(“Hola-soy-age
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(可调用c:agentCallables)
{
Future=pool.submit(c);
agentFutureSet.add(未来);
}
然后我用
for(Future<HashMap<Integer, Agent>> f : agentFutureSet)
try
{
//Here goes the code at the beginning
for(未来f:agentFutureSet)
尝试
{
//下面是开头的代码
在调用get()
之前是否检查了线程的中断标志?可以使用线程.currentThread().isInterrupted()
执行此操作
有关更多信息,请查看的javadoc,了解它为何会引发InterruptedException。异常的原因是可丢弃的(方法调用不是异常) 该线程只有在您导致它被破坏的情况下才会被破坏,它不会随机发生
如果您确实不知道中断来自何处,并且希望忽略它,则可以先清除它。调用
Thread.interrupted()
这表示执行提交的可调用文件的线程被中断。这可能是合法的中断(例如,Callable
执行一些阻塞操作,如Thread.sleep,并通过Thread.interrupt()
)被显式中断,或者可能是ExecutorService
(假设您正在使用此服务)通过调用shutdownow()
被关闭
您可以发布用于创建线程池的代码以及
可调用的实现吗?从.get()
抛出的裸InterruptedException
表示当前执行线程(调用.get()
的线程)在调用get()之前被中断
,或在.get()
中被阻止时。这与被中断的执行器线程或其任务不同。有人或某事正在中断“主”线程,或者至少是调用.get()
的线程
中断不是随机发生的——有些代码必须故意造成中断。中断只能通过调用来启动,但有一些标准Java实用程序在幕后调用它,如和
好了,没有办法从外部跟踪中断原因的“原因链”或“堆栈跟踪”。您必须查看源代码以确定可以在何处启动中断,从而推断在您的情况下是什么方法调用导致了中断。太棒了!它在get()之前被中断了!我认为中断的异常来自提交的callable,它位于另一个线程上…如果您能解释,我将非常感激,不管怎样。非常感谢。您可以通过查看javadoc for Future来了解原因,这里:get抛出一个InterruptedException
“如果当前线程在等待时被中断”令人难以置信的是,我在发布之前浏览了很多次那个页面,但不知怎么的,我的大脑没有意识到等待的线程就是这个!有趣的是,其他人也有同样的误解,这次我在仔细阅读文档后向他们解释了同样的事情。这是一次非常有趣的首次发布体验在stackoverflow!我知道它是一次性的,我是说callable没有在任何地方抛出异常。很抱歉这么糟糕地表达了我自己。不管怎样,你是,调用interrupted()允许从get获取结果!非常感谢。实际上,这正是我所想的,这个中断将属于提交的可调用对象,但事实并非如此。可调用对象中调用方法的代码实际上是一个println。executorservice非常简单…不小心按了enter,对不起,服务是pretty straight forward private Executor Service pool=Executors.newCachedThreadPool();如前所述,问题是提交可调用项的currentThread被中断。仔细阅读文档后,它会声明“InterruptedException-如果当前线程在等待时被中断”.这对于所发生的事情来说是有意义的,因为当前线程在启动之前处于中断状态,并且该线程正在等待答案,而不是子线程可调用线程…我认为。我完全理解它们不会发生,如果是那样的话,我很抱歉…我想知道的是它发生在哪里ing。之所以会出现这种混乱,是因为我认为有人在中断可调用程序,这是错误的。主线程被中断是完全意料之中的事情,因为它属于一个模拟器……至少现在我知道了这个简单的InterruptedException意味着什么。@dgrandes:很公平,我想你完全理解现在发生的事情。最好幸运的是,多线程可能是一件棘手的事情!:-)