У меня есть ThreadPoolExurexuster, который, кажется, лжет мне, когда я называю TOCACTIVECOUNT (). Однако я не сделал много многопотативных программиров, поэтому, возможно, я делаю что-то неправильно.
Вот мой TPE
@Override
public void afterPropertiesSet() throws Exception {
BlockingQueue<Runnable> workQueue;
int maxQueueLength = threadPoolConfiguration.getMaximumQueueLength();
if (maxQueueLength == 0) {
workQueue = new LinkedBlockingQueue<Runnable>();
} else {
workQueue = new LinkedBlockingQueue<Runnable>(maxQueueLength);
}
pool = new ThreadPoolExecutor(
threadPoolConfiguration.getCorePoolSize(),
threadPoolConfiguration.getMaximumPoolSize(),
threadPoolConfiguration.getKeepAliveTime(),
TimeUnit.valueOf(threadPoolConfiguration.getTimeUnit()),
workQueue,
// Default thread factory creates normal-priority,
// non-daemon threads.
Executors.defaultThreadFactory(),
// Run any rejected task directly in the calling thread.
// In this way no records will be lost due to rejection
// however, no records will be added to the workQueue
// while the calling thread is processing a Task, so set
// your queue-size appropriately.
//
// This also means MaxThreadCount+1 tasks may run
// concurrently. If you REALLY want a max of MaxThreadCount
// threads don't use this.
new ThreadPoolExecutor.CallerRunsPolicy());
}
в этом классе у меня также есть дао, которого я передаю в мою прогонзуру ( FOOOORORKER
), вроде так:
@Override
public void addTask(FooRecord record) {
if (pool == null) {
throw new FooException(ERROR_THREAD_POOL_CONFIGURATION_NOT_SET);
}
pool.execute(new FooWorker(context, calculator, dao, record));
}
FOOORORKER
Run запись
(единственный неинтеллетон) через гос машину через калькулятор
затем отправляет переходы в базу данных через DAO
, как и так:
public void run() {
calculator.calculate(record);
dao.save(record);
}
После того, как мой основной поток будет создавать новые Задачи, которые я пытаюсь, дождаться, чтобы убедиться, что все темы успешно завершили:
while (pool.getActiveCount() > 0) {
recordHandler.awaitTermination(terminationTimeout,
terminationTimeoutUnit);
}
Что я вижу из журналов выходных (которые, по-видимому, ненавидны из-за резьбы), заключается в том, что GetactiveCount () возвращается ноль слишком рано, а то время () Цикл выходит, пока мои последние потоки все еще печатают выход из калькулятора
.
Примечание. Я также попробовал позвонить Pool.Shutdown ()
, а затем с использованием Andettermination
Но тогда в следующий раз, когда моя задача выполняется, бассейн все еще выключается.
Мой только Угадайте - это то, что внутри нити, когда я отправляю данные в DAO
(поскольку это синглтон, созданный весной в главной ните ...), Java Учитывая резьбу неактивности с момента (, я предполагаю ) Это обработка в / ожидание в основной нити.
Интуитивно, основываясь только на том, что я вижу, это мое предположение. Но ... это действительно то, что происходит? Есть ли способ «сделать это правильно», не вкладывая ручную подъемную переменную в верхней части RUN ()
и уменьшается в конце для отслеживания количества потоков?
Если ответ «Не проходите в Дао», то бы мне не придется «новый» DAO для каждого потока? Мой процесс уже есть (красивый, эффективный) зверь, но это действительно сосет.