2011-10-24 88 views
1

我在oracle數據庫中有大量的記錄,他們需要完成一些操作。 應用程序獲取4個參數作爲輸入。它們是「範圍從」,「範圍到」,「線程計數」和「塊大小」。 通過使用此參數,應用程序計算應爲每個線程分配多少條記錄。 當線程啓動時,它通過blockSize從databasee blockSize中獲取記錄,並執行一些操作,然後將記錄保存到另一個databse表中。 我使用8個cpus在一臺機器上測試了10000條記錄的應用程序,並將線程數設置爲8.沒有問題。 在實際環境中,有1,000,000條記錄和16個cpus。通過在那裏運行應用程序,並將線程計數設置爲16或12,某些線程不會啓動。沒有錯誤或異常消息。他們只是從來沒有 不運行。其他線程成功啓動。任何想法?並非所有java線程都開始

下面是部分代碼編寫線程:

List list = new ArrayList(); 
Object[] records; 

int allIDsSize = to - from + 1; 

int segmentSize = Math.round(allIDsSize % threadsCount == 0 ? allIDsSize/threadsCount : allIDsSize/threadsCount + 1); 

Semaphore semaphore = new Semaphore(0); 

List<Future> threads = new ArrayList<Future>(); 
int k = 0; 
while (k * segmentSize < allIDsSize) { 
    int from2 = segmentSize * k + 1; 

    int to2; 
    if (from2 + segmentSize - 1 < allIDsSize) { 
     to2 = from2 + segmentSize - 1; 
    } else { 
     to2 = allIDsSize; 
    } 

    k++; 

    MyThread thread = new MyThread(from + from2 - 1, from + to2 - 1, semaphore); //MyThread implements Callable<String> 

    if (log.isInfoEnabled()) { 
     log.info(String.format("Thread IDs are from %d to %d", (from + from2 - 1), (from + to2 - 1))); 
     log.info("thread started " + k); 
    } 

    Future<String> future = pool.submit(thread); 
    threads.add(future); 
} 

semaphore.acquire(threads.size()); 

感謝。

Solmaz。

+2

什麼是'pool',它是如何定義的? – Thilo

+0

你可以添加MyThread構造函數的代碼嗎? – SJuan76

+0

池是ExecutorService並聲明爲final並在構造函數中初始化: pool = Executors.newFixedThreadPool(threadsCount); – Mahsa

回答

0

這可能是某些線程在所有任務提交給執行程序隊列之前完成的,因此執行程序服務不必創建最大數量的線程(固定線程池根據需要創建新線程)達到極限,它不會一次創建所有線程)。

作爲一個方面說明:這是混淆您使用線程概念(threadMyThread)的東西是真的任務,(即RunnableCallable)。

相關問題