gpt4 book ai didi

java - java并发编程的ExecutorService如何使用?

转载 作者:行者123 更新时间:2023-11-30 06:36:14 25 4
gpt4 key购买 nike

我正在使用下面的代码在远程服务器上上传图片。当我使用下面的代码时,它会同时在远程服务器上上传所有图片。

List<Future<String>> futureList = new ArrayList<Future<String>>();
ExecutorService execService = Executors.newFixedThreadPool(Images.size());
for (IImage image : Images) {
try {
//execService.execute(lServerRequest.new uploadImages(image.getDataPath(),image.getDisplayName()));
singleFuture = execService.submit(lServerRequest.new uploadImages(image.getDataPath(),image.getDisplayName()));
//Log.d("","singleFuture -------"+singleFuture.get());
futureList.add(singleFuture);
Log.d("","futureList Size:"+futureList.size());
} catch(Exception e){
execService.shutdown();
}

每当我使用下面的代码

   singleFuture = execService.submit(lServerRequest.new uploadImages(image.getDataPath(),image.getDisplayName()));
//Log.d("","singleFuture -------"+singleFuture.get());
futureList.add(singleFuture);

将所有future对象添加到futurelist中,立即从runnable返回(不在runnable中等待,直到所有图片上传完成(后台上传处理正在进行)

但是每当我在上面的代码中取消注释下面的行时,在成功上传每张图片后它会从 runnable 返回。

singleFuture = execService.submit(lServerRequest.new uploadImages(image.getDataPath(),image.getDisplayName()));
Log.d("","singleFuture -------"+singleFuture.get());
futureList.add(singleFuture);

我的代码有什么问题吗?是否可以一次多次连接远程服务器或服务器上有任何负载?如何使用并发编程java上传图像?请给我们指导?

submit()execute() 函数的效果一样吗?

最佳答案

当您调用 singleFuture.get() 时,您正在等待操作完成。所以循环不会继续执行下一条语句,直到这条语句返回结果。

您需要在第一个循环中提交您的任务,然后,另一个循环应该遍历列表中的结果 future.get() 以使其异步

来自@andersoj的回答;

池大小应该与您的 CPU 内核有关。不是您手头的图像数量。假设你有 2 个核心 CPU,图片上传 io 时间的系数为 5(只是我猜测的系数)。

POOL_SIZE = NUM​​_OF_CPU_CORE*系数;

关于java - java并发编程的ExecutorService如何使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5115940/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com