Java获取线程实例的计数
我有一个使用多线程方法更新数据库的对象 现在,我不想因为更新尝试而使数据库连接崩溃,我想等待是否有一定数量的线程处于活动状态 实现可运行的Java获取线程实例的计数,java,multithreading,Java,Multithreading,我有一个使用多线程方法更新数据库的对象 现在,我不想因为更新尝试而使数据库连接崩溃,我想等待是否有一定数量的线程处于活动状态 实现可运行的的类称为updateUnmarked 现在,我只想在线程数为
的类称为updateUnmarked
现在,我只想在线程数为
Thread.getAllStackTraces().keySet().size()
似乎不起作用,而且以下问题似乎也无法解决:
public static int getLiveThreads(){
ThreadMXBean bean = null;
bean = ManagementFactory.getThreadMXBean();
return bean.getThreadCount();
}
两者都只返回8个线程…但我肯定有超过8个线程
你知道怎么做吗
谢谢
现在,我只想在线程数小于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()
肯定能用。它返回当前线程组中活动线程的数量。您需要做的是在开始数据库工作之前对线程数进行快照。有许多系统线程在后台运行,执行各种您应该忽略的任务。然后,无论何时进行新计数,都可以减去后台线程,只跟踪数据库线程
但是线程池总是一个好主意。我认为在这里使用spring的threadpool executer服务更干净
<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>
我认为如果在关键部分(DB use)使用一个信号量会更容易,因此您可以创建所需数量的线程,而没有信号量的线程将等待它。此外,如果您使用大量的DB连接,那么像c3p0这样支持连接池的DB连接管理器可能会很有用(这样您就不必连续打开和关闭连接,因为这通常是一个繁重的操作)。只需使用固定大小的线程pool@artbristol:说得好。这里有一个很好的例子链接