java - java中的多个并行线程不会终止

标签 java multithreading concurrency garbage-collection hyperthreading

我尝试在java中运行一组并行线程。我通过高阶函数创建它们,如下所示:

public static void parallelizedMap(Consumer<String> f, List<String> list, int count) {
    List<List<String>> parts = new ArrayList<List<String>>();
    final int N = list.size();
    int L = N / (count - 1);
    for (int i = 0; i < N; i += L) {
        parts.add(new ArrayList<String>(list.subList(i, Math.min(N, i + L))));
    }
    for (List<String> e : parts) {
        Runnable r = new Runnable() {
            public void run() {
                e.forEach(f);
            }
        };
        new Thread(r).start();
    }
}

此方法每隔几分钟调用一次。几分钟后它会创建数百个线程。每个线程只运行 20 秒。但我的调试表明它们永远不会终止,因此我得到这个异常:

java.lang.OutOfMemoryError: GC overhead limit exceeded

提前致谢

最佳答案

我不认为问题出在线程上。但如果计数是列表大小的两倍或以上:

final int N = list.size(); // N = 10, count = 22
int L = N / (count - 1);  // L = 10 / (22-1) = 0.476 / L = 0.4d = (int) 0;
for (int i = 0; i < N; i += 0) {
     parts.add(new ArrayList<String>(list.subList(i, Math.min(N, i + 0))));
}

迭代是一个无限循环,但内存使用量每次迭代都会增加。

自然是内存不足。

关于java - java中的多个并行线程不会终止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42915545/

相关文章:

java - 如何在java中以以下模式dd/MM/yyyy获取今天的日期?

java - 创建返回带有指定消息的 JOptionPane.showMessageDialog 的方法?

ios - 我应该从它自己的线程中重置上下文吗?

multithreading - 如何可靠地清理执行阻塞 IO 的 Rust 线​​程?

java - 可重入锁 VS 可重入读写锁

Java:读取 XML 文件并将信息存储在文本文件中的快速方法

java - 为ELKI中的关系添加索引

Java - 同步方法导致程序大幅减速

java - "Partial Ordering"和 Happens-before 关系 java

python - Flask 和缩放与并发