Future.get () всегда прерывается с помощью InterruptedException

У меня СТРАННАЯ проблема с Future.get () в Java. Он всегда возвращается с InterruptedException, однако странно то, что причина Exception - null, поэтому я не могу сказать, кто меня прервал ...

Это становится еще хуже, потому что я проверяю перед вызовом get (), а задание Future должен сделать, уже сделано.

Вот код, отвечающий за вывод ниже. f - это будущее , а вызываемый объект возвращает HashMap, где Agent не имеет отношения к делу. Извините, если печатных строк слишком много, я Я просто пытаюсь дать как можно больше информации. Метод вызова из callable на данный момент представляет собой простой System.out.println ("Hola soy Agentte") , который, как вы увидите, печатается, что означает, что вызываемый объект также не вызвал исключения

Вот код:

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
6
задан Yu Hao 14 June 2018 в 06:24
поделиться