2013-02-09 36 views
1

我有一个对象用于使用多线程方法更新数据库。Java获得线程实例的数量

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

我的课implements RunnableupdateUnmarked

现在,我只希望推出一个新的线程,如果我的线程数是< X

Thread.getAllStackTraces().keySet().size()似乎并没有工作,还有以下似乎并没有解决这个问题:

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

    return bean.getThreadCount(); 
} 

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

任何想法如何做到这一点?

谢谢!

+0

我认为它会更容易,如果你只是使用的旗语临界区部分(DB使用),所以你创造尽可能多你需要的线程和没有信号量的线程将等待它。另外,如果您使用大量的数据库连接,可能像支持连接池的c3p0这样的数据库连接管理器可能会很有用(因此您不必持续打开和关闭连接,因为它通常是繁重的操作)。 – SJuan76 2013-02-09 19:52:25

+0

只需使用固定大小的线程池 – artbristol 2013-02-09 20:01:14

+0

@artbristol:好点。这里是一个很好的链接与例子http://www.javacodegeeks.com/2013/01/java-thread-pool-example-using-executors-and-threadpoolexecutor.html – 2013-02-09 20:21:21

回答

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

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

0

我认为这是清洁剂使用这里的春天的线程池执行者服务

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