Вопрос

У меня странная проблема с 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 реализация?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top