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

时间:2017-03-20 23:02:57

标签: 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

提前致谢

2 个答案:

答案 0 :(得分:1)

我不认为问题是线程。但如果count是列表大小的两倍或更多:

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

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

当然它是一个OutOfMemory。

答案 1 :(得分:0)

对我来说,解决方案是给每个线程一个额外的jdbc连接,不要让它们共享一个。这解决了死锁,并按预期终止。