Future.get () всегда прерывается с прерываннымException
-
28-09-2019 - |
Вопрос
У меня странная проблема с Future.get () в Java. Он всегда возвращается с прерываниемException, однако странная вещь состоит в том, что причиной исключения является ноль, поэтому я не могу сказать, кто меня прервала ..
Это становится еще хуже, потому что я проверяю, прежде чем звонить Get (), и будущее работа должно сделать, уже сделано.
Вот код, ответственный за вывод ниже. Ф будущее, и Callable возвращает Hashmap, где агент не актуален. Извините, если есть слишком много принт горизонта, я просто пытаюсь дать как мою музыку. Метод вызова от Callable находится на данный момент простой 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)
В случае, если вы хотите увидеть, где я Shumbit Callable к ThreadPool ... тогда это будет код для него
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
Решение
Вы проверили флаг прерывания потока перед вызовом get()
? Вы можете сделать это с Thread.currentThread().isInterrupted()
.
Для получения дополнительной информации посмотрите на Javadoc для Future.get () чтобы понять, почему он бросит прерываниеException.
Другие советы
Голый InterruptedException
быть выброшенным .get()
Указывает, что текущая резьба выполнения (вызов потока .get()
) был прерван перед вызовом get()
, или во время заблокированного в .get()
. Отказ Это нет то же самое, что и нить исполняющих или один из его задач прерывается. Кто-то или что-то прерывает вашу «основную» нить - или, по крайней мере, вызов потока .get()
.
Прерывания не происходят случайным образом - какой-то код должен намеренно вызывать прерывание. Прерывание может Только быть инициированным призовом к Thread.interrupt()
, но есть несколько стандартных утилит Java, которые называют это за кулисами, как Future.cancel(true)
а также ExecutorService.shutdownNow()
.
AFAIK, нет никакого способа внешнего отслеживания «причина цепи» или «трассировку стека» причины прерывания. Вы должны посмотреть на исходный код для определения того, где могут быть инициированы прерывания, и, таким образом, вывод, какой метод вызова (ы) вызывают прерывание в вашем случае.
Причина исключения - это бросаемый (позыв метода не является исключением)
Нить будет аннулирована только в том случае, если вы заставляете это быть, это не произойдет случайно.
Если вы действительно понятия не имеете, где прерывают и хотите игнорировать его, вы можете очистить его первым. вызов Thread.interrupted()
Это указывает на тему, выполняющее представленное Callable, станут прерванным. Это может быть зановому прерыванию (например, если Callable
выполняет некоторую операцию блокировки, такие как Thread.sleep и явно прервана через Thread.interrupt()
), или это может быть то, что ExecutorService
(Предполагая, что вы используете это), выключается через вызов shutDownNow()
.
Можете ли вы опубликовать код, используемый для создания пула резьбы вместе с вашим Callable
реализация?