2011-10-24 10 views
1

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。

+2

'プール'とは何ですか、どのように定義されていますか? – Thilo

+0

MyThreadコンストラクタのコードを追加できますか? – SJuan76

+0

プールはExecutorServiceで、最終として宣言され、コンストラクタで初期化されます。 プール= Executors.newFixedThreadPool(threadsCount); – Mahsa

答えて

0

すべてのタスクがエグゼキュータ・キューに投入される前に一部のスレッドが終了している可能性があります。したがって、エグゼキュータ・サービスは最大数のスレッドを作成する必要はありません(固定スレッド・プールは、限界まで、一度にすべてのスレッドを作成するわけではありません)。サイドノートとして

:あなたが本当にタスク、(すなわちRunnableまたはCallable)で何かをスレッド概念(threadMyThread)を使用することを混乱さ。

関連する問題