我在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。
什麼是'pool',它是如何定義的? – Thilo
你可以添加MyThread構造函數的代碼嗎? – SJuan76
池是ExecutorService並聲明爲final並在構造函數中初始化: pool = Executors.newFixedThreadPool(threadsCount); – Mahsa