2013-02-09 3 views
1

У меня есть объект, который используется для обновления базы данных с использованием многопоточной методологии.Java получает количество экземпляров потоков

Теперь я не хочу разрушать мое соединение db, подавляя его попытками обновления, и хочу дождаться, если у меня будет определенное количество потоков.

мой класс, который implements Runnable называется updateUnmarked.

сейчас, я хочу только начать новую тему, если мой счет нити < X

Thread.getAllStackTraces().keySet().size() не похоже на работу, а также следующее, кажется, не решить:

public static int getLiveThreads(){ 
    ThreadMXBean bean = null; 
    bean = ManagementFactory.getThreadMXBean(); 

    return bean.getThreadCount(); 
} 

как return 8 only ... но я определенно имею более 8 потоков.

Любая идея, как это сделать?

Спасибо !!!

+0

Я думаю, было бы проще, если бы вы просто использовали семафор для критической части разреза (использование БД), так что вы создать столько потоки, которые вам нужны, и те, у которых нет семафора, будут ждать его. Кроме того, если вы используете большое количество подключений к БД, возможно, менеджер соединений с DB, такой как c3p0, который поддерживает объединение пулов, может оказаться полезным (так что вам не нужно постоянно открывать и закрывать соединения, поскольку это обычно тяжелая операция). – SJuan76

+0

Просто используйте пул потоков с фиксированным размером – artbristol

+0

@artbristol: хорошая точка. вот хорошая ссылка с примерами http://www.javacodegeeks.com/2013/01/java-thread-pool-example-using-executors-and-threadpoolexecutor.html –

ответ

2

сейчас, я хочу только начать новую тему, если мой счет нити < X

Звуки мне, что вам нужно, это поток бассейн исполнитель. Обновления базы данных могут быть представлены в пул для выполнения, и вы можете ограничить число одновременных запросов к базе данных за счет ограничения количества потоков, назначенных к бассейну:

// create a thread pool with a max of 4 concurrent threads 
ExecutorService threadPool = Executors.newFixedThreadPool(4); 

// submit your database operation to the thread-pool 
threadPool.submit(new DatabaseUpdateJob(databaseConnection, updateStatement)); 

... 
public class DatabaseUpdateJob implements Runnable { 
    // you can construct your jobs and pass in context for them if necessary 
    public DatabaseUpdateJob(Connection dbConnection, String statement) { 
     ... 
    } 
    public void run() { 
     // use the connection here to update the database 
    } 
} 

Если вы действительно хотите сделать это самостоятельно то Thread.activeCount() должен определенно работать. Он возвращает количество активных потоков в текущей группе потоков. Что вам нужно сделать, так это сделать снимок количества потоков до начала работы вашей базы данных. Существует ряд системных потоков, которые работают в фоновом режиме, выполняя различные задачи, которые вы должны игнорировать. Затем всякий раз, когда вы берете новый счет, вы можете вычесть фоновые потоки и отслеживать только потоки базы данных.

Но поток-пул - это всегда хорошая идея.

0

Я думаю, что это уборщик использовать ThreadPool Исполнитель службы весной здесь

<bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor"> 
    <property name="corePoolSize" value="5" /> 
    <property name="maxPoolSize" value="10" /> 
    <property name="queueCapacity" value="25" /> 
</bean> 
Смежные вопросы