2013-02-09 70 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>