Oracleデータベースには、いくつかの操作が実行される膨大なレコードがあります。 アプリケーションは4つのパラメータを入力として取得します。それらは "Range from"、 "Range to"、 "Thread counts"、 "blockSize"です。 このパラメータを使用すると、アプリケーションは各スレッドに割り当てられるレコードの数を計算します。 スレッドが起動すると、blockSizeによってデータベースblockSizeからレコードをフェッチし、いくつかの操作を実行した後、レコードを別のデータベーステーブルに保存します。 私は8 cpusとスレッド数を8に設定したマシンで10,000レコードでアプリケーションをテストしました。問題はありません。 実際の環境では、1,000,000レコードと16 CPUがあります。アプリケーションをそこで実行し、スレッド数を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。
'プール'とは何ですか、どのように定義されていますか? – Thilo
MyThreadコンストラクタのコードを追加できますか? – SJuan76
プールはExecutorServiceで、最終として宣言され、コンストラクタで初期化されます。 プール= Executors.newFixedThreadPool(threadsCount); – Mahsa