【发布时间】:2016-12-17 07:22:54
【问题描述】:
我最近不得不实现一个控制器,将文件从 A 传输到 B。 大约有 8000 个文件,每个文件大小为 1-2 mb。
- 如果一个文件传输成功,创建另一个线程。 (目前增加 corePoolSize +1)
- 如果一个文件传输失败,关闭一个线程重试传输。(当前增加corePoolSize -1)
- 如果一个文件传输失败,一定时间内不要创建另一个线程。
这背后的想法是在不知道主机限制的情况下获得最大可能的连接数/最佳传输速度。
现在我的问题是,ThreadPoolExecutor 是实现此行为的最佳方式还是有更好的方式?
//Code simplified
//add all files to callables with type Future<Boolean>
while (true) {
// entry = get the first result that's done.
if (entry.getValue().get() == Boolean.TRUE) {
results.remove(entry.getKey());
if (results.size() > threadPool.getCorePoolSize()) {
if (System.currentTimeMillis() >= nextAttempt)
resizeThreadPool(+1);
}
} else {
resizeThreadPool(-1);
nextAttempt = System.currentTimeMillis() + someTimeinMs;
entry.setValue(threadPool.submit(entry.getKey()));
}
if (results.isEmpty())
return true;
}
编辑:作为参数给出了最小和最大线程数。
【问题讨论】:
-
您需要彻底重新考虑这一点。您的计算与“最佳传输速度”没有任何关系,因此您最终将创建大量线程,所有线程都在为 CPU 和网络而颠簸并相互竞争,并且绝对无处可去。您应该使用的最大线程数是路径带宽除以目标传输速率。你会发现这个数字很小。
标签: java multithreading io java.util.concurrent threadpoolexecutor