Java获取线程实例的数量

时间:2013-02-09 19:46:24

标签: java multithreading

我有一个用于使用多线程方法更新数据库的对象。

现在,我不想通过更新尝试来压倒我的数据库连接,并且想要等待我有一定数量的线程。

我的班级implements Runnable被称为updateUnmarked

现在,我想只在我的线程数为< X

时启动一个新线程

Thread.getAllStackTraces().keySet().size()似乎不起作用,以下似乎也无法解决问题:

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

    return bean.getThreadCount();
}

两者都只返回8 ...但我肯定有超过8个线程。

知道怎么做吗?

感谢!!!

2 个答案:

答案 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>