java 中的多个并行线程不终止
multiple parallel threads in java dont terminate
我尝试 运行 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();
}
}
此方法每隔几分钟调用一次。几分钟后它会创建数百个线程。每个线程仅 运行s 持续 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))));
}
迭代是一个无限循环,但每次迭代都会增加内存使用量。
自然是OutOfMemory。
对我来说,解决方案是给每个线程一个额外的 jdbc 连接,不要让它们共享一个。这解决了僵局,它们按预期终止。
我尝试 运行 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();
}
}
此方法每隔几分钟调用一次。几分钟后它会创建数百个线程。每个线程仅 运行s 持续 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))));
}
迭代是一个无限循环,但每次迭代都会增加内存使用量。
自然是OutOfMemory。
对我来说,解决方案是给每个线程一个额外的 jdbc 连接,不要让它们共享一个。这解决了僵局,它们按预期终止。