Java Future.get()总是被InterruptedException中断

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

我对Java中的Future.get()有一个奇怪的问题。它总是以InterruptedException返回,然而奇怪的是,异常的原因是空的,所以我不知道是谁打断了我

更糟糕的是,我在调用get()之前进行了检查,而将来要做的工作已经完成了

下面是负责以下输出的代码f是未来,可调用函数返回一个HashMap,其中代理并不真正相关。对不起,如果有太多的打印行,我只是想给尽可能多的信息。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(可调用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:很公平,我想你完全理解现在发生的事情。最好幸运的是,多线程可能是一件棘手的事情!:-)