1

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

现在,我不想通过更新尝试来压倒我的数据库连接,并且如果我有一定数量的线程处于活动状态,我想等待。

我的班级implements Runnable叫做updateUnmarked.

现在,如果我的线程数是,我只想启动一个新线程< X

Thread.getAllStackTraces().keySet().size()似乎不起作用,以下似乎也没有解决它:

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

    return bean.getThreadCount();
}

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

知道怎么做吗?

谢谢!!!

4

2 回答 2

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()绝对应该工作。它返回当前线程组中的活动线程数。您需要做的是在开始数据库工作之前拍摄线程数的快照。有许多系统线程在后台运行,执行您应该忽略的各种任务。然后,每当您进行新计数时,您都可以减去后台线程并仅跟踪您的数据库线程。

但是线程池总是一个好主意。

于 2013-02-09T20:23:42.090 回答
0

我认为在这里使用spring的线程池执行器服务更干净

<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>
于 2013-02-09T20:33:22.673 回答