Реализация java FixedTreadPool статуса слушателя - PullRequest
2 голосов
/ 14 мая 2010

Речь идет о приложении, которое должно обрабатывать (VAD, Loudness, Clipping) много звуковых файлов (например, 100 КБ). В настоящее время я создаю столько рабочих потоков (вызываемых элементов), сколько могу поместить в память, а затем запускаю все с помощью threadPool.invokeAll (), записываю результаты в файловую систему, выгружаю обработанные файлы и продолжаю на шаге 1. В связи с Дело в том, что это приложение с графическим интерфейсом, я не хочу, чтобы пользователь чувствовал, что приложение «не отвечает» при обработке всех звуковых файлов. (что он делает в это время, потому что invokeAll блокируется). Я не уверен, что это «хороший» способ исправить это. Для пользователя не должно быть возможности делать другие вещи во время обработки, но я хотел бы показать индикатор выполнения, такой как «10 из 100000 звуковых файлов готовы». Так как мне туда добраться? Нужно ли мне создавать «поток наблюдателя», чтобы каждый работник удерживал на нем обратный вызов? Я довольно новичок в многопоточности и не понимаю, каков такой механизм.

Если вам нужно знать: я использую SWT / JFace.

Ответы [ 2 ]

3 голосов
/ 15 мая 2010

Вы можете использовать ExecutorCompletionService для этой цели; если вы отправляете каждую из Callable задач в цикле, вы можете затем вызвать метод take службы завершения, получая задачи по одной после их завершения. Каждый раз, когда вы берете задание, вы можете обновлять свой графический интерфейс.

В качестве другого варианта вы можете реализовать свой собственный ExecutorService, который также является Observable, позволяющий публиковать обновления для подписчиков Observer s при каждом завершении задачи.

2 голосов
/ 14 мая 2010

Вы должны взглянуть на SwingWorker. Это хороший класс для выполнения длительных операций, в то же время сообщая о прогрессе в графический интерфейс и поддерживая отзывчивый графический интерфейс.

Использование рабочего потока Swing предоставляет полезную информацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...