2016-02-19 1 views
0

У меня есть пул потоков инстанцированного сПотерянных все представленные задачи в ThreadPoolExecutor

LinkedBlockingQueue<Runnable> taskQue = new LinkedBlockingQueue<Runnable>(); 
    new ThreadPoolExecutor(100, 100, 0L, TimeUnit.MILLISECONDS, taskQue); 

я представил большое количество (18k +) работоспособных задачи к нему; каждая задача будет обрабатывать и отправлять данные в другой LinkedBlockingQueue, скажем, dataQue, и у меня есть цикл while (True) для опроса и обработки этих данных из dataQue.

Я регистрирую размер taskQue каждую минуту, он работает нормально на некоторое время, потому что я вижу, что его размер уменьшается постепенно. Однако, примерно через 20 минут после запуска программы, размер уменьшается с 17927 до 0! Моя программа все еще работает в этой точке, и цикл while все еще обрабатывает данные из dataQue.

Мне интересно, как это возможно? Я занимаюсь поиском и изучением джавакоков. Ни LinkedBlockingQueue, ни ThreadPoolExecutor, кажется, автоматически отменяет/время ожидания. Возможно ли, что GC ест мои задачи?

+0

Да, его переменная класса, поэтому не должна выходить за рамки. Я checjed все его потоки живы, просто ждут задач. – Hebo

ответ

1

Нет, это невозможно. Это, безусловно, связано с чем-то в вашем коде.

Очень распространенный сценарий заключается в том, что ваши задачи терпят неудачу из-за некоторого исключения (и, следовательно, очень быстро), но вы просто не видите трассировку стека. Одна простая вещь - поймать Throwable в вашей задаче и зарегистрировать исключение. Вы также можете использовать Callable и проверить статус задач с помощью возвращаемого Future.

+0

Спасибо за ответ. Я думаю, вы правы. Позвольте мне добавить sone logs для проверки. – Hebo

+0

Еще раз спасибо! Это действительно проблема. – Hebo

Смежные вопросы