возможность получить прогресс на объекте Future <T> - PullRequest
13 голосов
/ 16 февраля 2010

Ссылаясь на пакет java.util.concurrent и интерфейс Future, я замечаю (если не ошибаюсь), что возможность запускать длинные задачи и иметь возможность запрашивать ход выполнения предоставляется только с классом реализации SwingWorker. 1001 *

Напрашивается следующий вопрос:

Есть ли способ в не-GUI-приложении, не являющемся Swing (создание консольного приложения), запускать длинную задачу в фоновом режиме и позволять другим потокам проверять ход выполнения? Мне кажется, что нет никаких причин, почему эта возможность должна быть ограничена приложениями Swing / GUI. В противном случае, единственная доступная опция, как я вижу, это пройти через ExecutorService :: submit, который возвращает объект Future. Однако базовый интерфейс Future не позволяет отслеживать ход выполнения.

Ответы [ 3 ]

5 голосов
/ 16 февраля 2010

Очевидно, что объект Future будет полезен только для блокировки и последующего получения результата.

Отправляемый вами объект Runnable или Callable должен либо знать, как обеспечить этот прогресс (процент выполнения, количество попыток, состояние (перечисление?) И т. Д.), И предоставлять его как вызов API для самого объекта или опубликовать в некотором поисковом ресурсе (в карте памяти или базе данных, если необходимо). Для простоты мне нравится сам объект, тем более что вам, скорее всего, понадобится дескриптор (id) для поиска объекта или ссылка на сам объект.

Это означает, что у вас работают 3 потока. 1 для фактической работы, 1, который заблокирован во время ожидания результата, и 1, который является потоком мониторинга. Последним можно поделиться в зависимости от ваших требований.

2 голосов
/ 26 мая 2011

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

2 голосов
/ 17 февраля 2010

Я надеялся, что существует стандартная среда параллелизма, позволяющая оставаться в курсе хода выполнения длительной задачи, не требуя от клиентской программы заботы об организации и синхронизации всего правильно. Мне показалось, что можно представить расширенную версию интерфейса Future<T>, которая будет поддерживать: public short progress(); в дополнение к обычным isDone() и get() методам. Очевидно, что реализация progress() должна будет напрямую опрашивать объект, поэтому, возможно, Future<T> нужно будет указать как Future<T extends CanReportProgress>, где CanReportProgress - это следующий интерфейс:

public interface CanReportProgress {
    public short progress();
}

Возникает вопрос: почему бы не пройти через объект Future, а не вызывать сам объект, чтобы получить прогресс? Я не знаю. Я должен подумать об этом. Можно утверждать, что он ближе к текущему контракту / семантике, в соответствии с которым объект Callable сам по себе снова не доступен клиентскому программисту после вызова ExecutorService::submit / execute.

...