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

标签 java multithreading jakarta-ee

我在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/

相关文章:

java - 如何打印LinkedHashMap中保存的数据

java - 重叠数据标签 (MPAndroidChart)

java - main() 可以在加入所有线程之前结束运行吗?

c - posix线程程序解释?

java - 在 Eclipse 3.6 中使用 Cygwin

Java Swing 编程结构 : are listeners supposed to be the source of almost all Swing components?

java - 使用 string.split() 时的前导空格

c++ - 查找线程错误

java - 如何使用JSP限制网页中显示的数据库记录?

OAuth2.0 的 Javax.xml.ws 客户端