Я занимался различными стратегиями для объединения потоков с помощью ThreadPoolExecutor с JDK6. У меня есть очередь приоритетов, но не была уверена, понравилось ли мне, как пул не изменился после keepAliveTime (что вы получаете с неограниченной очередью). Итак, я смотрю на ThreadPoolExecutor, используя политику LinkedBlockingQueue и CallerRuns.Почему ThreadPoolExecutor сокращает потоки ниже corePoolSize после keepAliveTime?
Проблема, с которой я столкнулся сейчас, заключается в том, что бассейн растет, так как документы объясняют, что это необходимо, но после завершения задач и включения keepAliveTime getPoolSize показывает, что пул становится сведенным к нулю. Пример ниже должен позволить вам увидеть основу для моего вопроса:
public class ThreadPoolingDemo {
private final static Logger LOGGER =
Logger.getLogger(ThreadPoolingDemo.class.getName());
public static void main(String[] args) throws Exception {
LOGGER.info("MAIN THREAD:starting");
runCallerTestPlain();
}
private static void runCallerTestPlain() throws InterruptedException {
//10 core threads,
//50 max pool size,
//100 tasks in queue,
//at max pool and full queue - caller runs task
ThreadPoolExecutor tpe = new ThreadPoolExecutor(10, 50,
5L, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>(100),
new ThreadPoolExecutor.CallerRunsPolicy());
//dump 5000 tasks on the queue
for (int i = 0; i < 5000; i++) {
tpe.submit(new Runnable() {
@Override
public void run() {
//just to eat some time and give a little feedback
for (int j = 0; j < 20; j++) {
LOGGER.info("First-batch Task, looping:" + j + "["
+ Thread.currentThread().getId() + "]");
}
}
}, null);
}
LOGGER.info("MAIN THREAD:!!Done queueing!!");
//check tpe statistics forever
while (true) {
LOGGER.info("Active count: " + tpe.getActiveCount() + " Pool size: "
+ tpe.getPoolSize() + " Largest Pool: " + tpe.getLargestPoolSize());
Thread.sleep(1000);
}
}
}
Я нашел старую ошибку, которая, кажется, этот вопрос, но он был закрыт: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6458662. Может ли это по-прежнему присутствовать в версии 1.6 или я что-то упускаю?
Похоже, что я резинка уклонилась от этого (http://www.codinghorror.com/blog/2012/03/rubber-duck-problem-solving.html). Ошибка, связанная выше, связана с этим: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6576792, где проблема, кажется, решена в 1,7 (я загрузил 1,7 и проверен - исправлен ...). На мой взгляд, моя главная проблема заключалась в том, что ошибка эта фундаментальная продолжалась почти десятилетие. Я потратил слишком много времени, написав это, чтобы не публиковать его сейчас, надеюсь, что это поможет кому-то.
+1 Приятная находка, был удивлен, увидев это поведение. –
Возможно, было бы лучше структурировать ваше сообщение как вопрос, а затем предоставить то, что вы узнали, как ответ? –