gpt4 book ai didi

java - 并非所有 java 线程都启动

转载 作者:行者123 更新时间:2023-12-01 05:37:48 24 4
gpt4 key购买 nike

我在oracle数据库中有大量记录,需要对它们进行一些操作。应用程序获取 4 个参数作为输入。它们是“范围从”、“范围到”、“线程计数”和“ block 大小”。通过使用此参数,应用程序计算应分配给每个线程的记录数。当一个线程启动时,它会从数据库blockSize中按blockSize获取记录并进行一些操作,然后将记录保存到数据库的另一个表中。我在8个cpu的机器上用10,000条记录测试了该应用程序,并将线程数设置为8。没有问题。在真实环境中,有1,000,000条记录和16个cpu。通过在那里运行应用程序,并将线程数设置为 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());

谢谢。

Solr 马兹。

最佳答案

很可能某些线程在所有任务提交到执行器队列之前就完成了,因此执行器服务不必创建最大数量的线程(固定线程池根据需要创建新线程,最多可达限制,它不会一次创建所有线程)。

作为旁注:令人困惑的是,您将线程概念(threadMyThread)用于真正的< em>任务,(即可运行可调用)。

关于java - 并非所有 java 线程都启动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7872225/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com