Я работаю над проектом, в котором есть большой вход элементов данных, которые необходимо обработать. Обработка каждого не зависит от других, и мне нужно получить результат от каждого. Теперь я создаю задачу Callable
для каждого элемента, который выполняет обработку, и используя ExecutorCompletionService
для получения результата Future
по мере завершения потоков.Определить количество выполненных задач в очереди ExecutorCompletionService
У меня тогда есть другой поток, который вытаскивает объекты Future
из очереди ExecutorCompletionService
. Этот поток просто вращается в бесконечном цикле while и вызывает take()
, который блокируется до появления Future
в очереди.
То, что я пытаюсь сделать, это избежать сценария, в котором очередь объектов Future
растет быстрее, чем я вытаскиваю их из очереди, поэтому я хотел бы спать процесс, который создает задачи, если я отстану от обработки Future
Результаты.
Проблема, с которой я сталкиваюсь, заключается в том, что я не могу найти способ увидеть, сколько объектов Future
находится в очереди ExecutorCompletionService
. Есть ли способ сделать это?
Возможно, у меня есть внешний счетчик, который я увеличиваю при создании новой задачи и уменьшаюсь при обработке Future
, но это только приводит меня к числу выдающихся задач, а не к числу действительно выполненных. Любые мысли о наилучшем способе борьбы с этим?
Если вы также сохранить счетчик, который увеличивается (монотонно), когда новая задача представляется, то 'totalSubmitted - выдающийся = done', нет? – yshavit
Можете ли вы перевернуть объекты через очередь пула и повторно использовать их? Это то, что я обычно делаю для межпоточного управления потоком объектов. Если пул заканчивается, поток, который создает задачи, блокируется в очереди пула, пока некоторые объекты не будут переработаны. –
Спасибо вам обоим. yshavit, когда я говорю «выдающийся» выше, который включает в себя оба элемента, которые были отправлены и еще не завершены, и те, которые были завершены, но все еще находятся в очереди. У меня нет возможности узнать, как группа выдающихся предметов делится между этими группами. Мартин, мне нравится эта идея, и это звучит многообещающе. Я сделаю это. Я ценю вход. – nolt2232