我有一个用于使用多线程方法更新数据库的对象。
现在,我不想通过更新尝试来压倒我的数据库连接,并且想要等待我有一定数量的线程。
我的班级implements Runnable
被称为updateUnmarked
。
现在,我想只在我的线程数为< X
Thread.getAllStackTraces().keySet().size()
似乎不起作用,以下似乎也无法解决问题:
public static int getLiveThreads(){
ThreadMXBean bean = null;
bean = ManagementFactory.getThreadMXBean();
return bean.getThreadCount();
}
两者都只返回8 ...但我肯定有超过8个线程。
知道怎么做吗?
感谢!!!
答案 0 :(得分:2)
现在,我想只在我的线程数是&lt; 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()
肯定会有效。它返回当前线程组中活动线程的数量。您需要做的是在开始数据库工作之前拍摄线程数的快照。有许多系统线程在后台运行,执行您应忽略的各种任务。然后,无论何时进行新计数,都可以减去后台线程并仅跟踪数据库线程。
但是线程池总是一个好主意。
答案 1 :(得分:0)
我认为在这里使用spring thread pool executor服务更简洁
<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>