ThreadPoolexecutor's Getactivecount ()

У меня есть 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 для каждого потока? Мой процесс уже есть (красивый, эффективный) зверь, но это действительно сосет.

5
задан inanutshellus 1 September 2011 в 14:08
поделиться