2017-02-21 37 views
0

Мне нужно выполнить сложные вычисления async и уметь прерывать их в любое время (из-за пределов вычислений).Как отменить асинхронное вычисление в любое время?

В текущей реализации используется scala.concurrent.Future для запуска вычислений. Однако, похоже, нет очевидного способа отменить будущее scala во время исполнения.

Я нашел и попробовал ряд рекомендуемых решений по этой проблеме, например, используя Promise для реализации cancellable Future или с помощью java.util.concurrent.Future, который имеет метод cancel().

Все они имеют одинаковую проблему: выполнение прерывается только при достижении вызова Thread.sleep().

Это проблема по двум причинам:

  1. Расчеты должны закончить как можно быстрее. Добавление даже очень коротких периодов сна является контрпродуктивным.
  2. Я не являюсь основным разработчиком этих вычислений, и я хочу избежать необходимости накладывать произвольные ограничения на реализацию вычислений.
+0

«выполнение только прерывается, когда оно достигает Thread.sleep()». Это не правда. Он будет прерван при достижении подходящего кода, который проверяет состояние прерывания потока. – Kayaman

+0

Похоже, что ваши вычисления слишком велики, если вам нужно беспокоиться о прерываниях в середине потока. Вы не говорите, какую рабочую нагрузку у вас есть и как легко это происходит. –

+0

@ChrisMowforth Что вы подразумеваете под «средним потоком» прерываний? Я больше не рассказывал о рабочей нагрузке, потому что это может быть почти все, от простого слова до сложного видеофильтра или симуляции. Я предоставляю среду для выполнения этих вычислений, и я должен уметь их убивать, если это необходимо. Эти вычисления выполняются третьими лицами. – DrummerB

ответ

3

В JVM вы не можете убить нить. Единственный безопасный способ остановить вычисление - это прервать его, что означает установить флаг/проверить флаг и остановить логику. Итак, чтобы как можно быстрее остановить вычисление, вам нужно как можно чаще проверять прерванный флаг. Достигните его в своей исполняемой/вызываемой реализации, и вы получите желаемый результат.