gpt4 book ai didi

java - Java Future多线程的正确实现

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:28:21 24 4
gpt4 key购买 nike

在我的 servlet 中,我点击了几个 URL 来检查它们的状态并将响应返回给用户。

点击多个请求需要很多时间:需要线程和超时。但我需要我的线程得到响应:出于这个原因使用 Future。

我的代码大纲:

ExecutorService executor = Executors.newFixedThreadPool(10);
Future<statusModel> future;

for (Map.Entry<String, String> url : urls.entrySet())
{
try
{
future = executor.submit(new CallableRequestStatus(url.getValue()));
status = (statusModel) future.get(5, TimeUnit.SECONDS);
results.add(status);
}
catch (InterruptedException | ExecutionException | TimeoutException e)
{
System.out.println("Error<checkServers>: Timeout OR "+e.getMessage());
}
}
executor.shutdownNow();

我的可调用类的所有结果都在状态对象中,我稍后将其添加到数组列表中。我的问题是我的方法阻止我同时运行所有 10 个线程。我必须等待 5 秒才能获取我的状态对象,然后转到下一个 URL。

我认为我的方法有问题。我尝试在线查找,但找不到任何涉及自定义对象和 Arraylist 的示例。

谁能帮我改正我的错误。提前致谢

终于更新了我的代码(感谢 Sotirios Delimanolis 和 Kevin):

ExecutorService executor = Executors.newFixedThreadPool(20);
List<Future<statusModel>> futures = new ArrayList<Future<statusModel>>();

for (Map.Entry<String, String> url : urls.entrySet())
{
Future<statusModel> future = executor.submit(new CallableRequestStatus(url.getValue()));
futures.add(future);
}

ArrayList<statusModel> results = new ArrayList<statusModel>();
statusModel status;

int i=0;

for (Map.Entry<String, String> url : urls.entrySet())
{
try
{
status = (statusModel) futures.get(i).get(500, TimeUnit.MILLISECONDS);
// do some stuff with status and

if(status.getStatusCode()/100 == 2)
results.add(status);
}
catch (InterruptedException | ExecutionException | TimeoutException e)
{
System.out.println("Error<checkServers>: Timeout OR "+e.getMessage());
}
i++;
}

executor.shutdownNow();
System.out.println("Shutdown: "+executor.isShutdown());

希望它对某人有帮助:)

最佳答案

您需要提前提交所有内容,然后单独等待。如下所示,为清楚起见删除了异常处理:

ExecutorService executor = Executors.newFixedThreadPool(10);
List<Future<statusModel>> futures = new ArrayList<>();

for (Map.Entry<String, String> url : urls.entrySet())
{
futures.add(executor.submit(new CallableRequestStatus(url.getValue())));
}
for (Future<statusModel> f : futures) {
results.add((statusModel) f.get(5, TimeUnit.SECONDS));
}

关于java - Java Future多线程的正确实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18316941/

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