Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java获取线程实例的计数_Java_Multithreading - Fatal编程技术网

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:说得好。这里有一个很好的例子链接