并非所有java线程都会启动

时间:2011-10-24 07:00:24

标签: java multithreading java-ee

我在oracle数据库中有大量的记录,可以为他们完成一些操作。 应用程序获取4个参数作为输入。它们是“Range from”,“Range to”,“Thread counts”和“blockSize”。 通过使用此参数,应用程序计算应为每个线程分配的记录数。 当一个线程启动时,它会通过blockSize从databasee blockSize中获取记录并执行一些操作,然后将记录保存到另一个数据库表中。 我在一台8 cpus的机器中测试了10,000条记录的应用程序,并将线程数设置为8.没有问题。 在真实环境中,有1,000,000条记录和16条cpus。通过在那里运行应用程序,并将线程计数设置为16或12, 有些线程无法启动。没有错误或异常消息。他们只是永远  不要跑。其他线程成功启动。任何想法?

以下是代码准备线程的一部分:

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());

感谢。

索尔马兹。

1 个答案:

答案 0 :(得分:0)

可能是某些线程在所有任务都已提交到执行程序队列之前完成,因此执行程序服务不必创建最大线程数(固定线程池根据需要创建新线程,直到限制,它不会立即创建所有线程。)

作为旁注:您使用线程概念(threadMyThread)来实现任务,(即RunnableCallable)。