gpt4 book ai didi

java - 如何在多线程环境中以循环方式从列表中返回值?

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

我必须编写一段代码,其中涉及对后端进行异步 Web 服务调用,并以循环方式从 TFN 列表中向调用方返回一个免费电话号码。下面是我的代码

@Stateless
public class TollFreeServiceBean {
@EJB
private AsyncBackendService asyncBean;
public long getTollFreeNumber(Request request) {
//Validate request
asyncBean.callBackend(request);
return TFNUtil.getNext();
}
}

@Stateless
public class AsyncBackendService {
@Asynchronous
public void callBackend(Request request) {
// Call web service and inform a caller with `Request` is going to call
}
}

public class TFNUtil {
private static int index = 0;
private TFNUtil(){}
public static synchronized long getNext() {
// Get TFN list from cache
if(tfnList.size() >= index) {
index = 0;
}
long tfn = tfnList.get(index);
index++;
return tfn;
}
}

想法是,在缓存中的 TFN 完成之前,每个客户将获得不同的 TFN。完成后,下一位客户应再次获得第一个 TFN。例如,如果有 10 个 TFN 和 11 个客户,则第 11 个客户应收到第一个 TFN。第 12 位客户应收到第二个 TFN,依此类推。

后端系统提示两个不同的同时客户登陆同一个 TFN。所以我认为我的 TFNUtil.getNext() 逻辑不对。

谁能指出这里的错误?

最佳答案

你的陈述自相矛盾。

一方面,您担心没有两个客户会收到相同号码。

另一方面,您有意建立了一个可以准确执行此操作的系统。

你看,根据你的列表 tfnList 有多少元素......你的方法 getNext() 可能会很快“溢出”。你认为那时会发生什么?

对我来说,听起来真正的解决方案更复杂:您可能需要重新设计系统。您可能需要一个能够在一段时间内阻止/保留号码的系统,而不是仅仅轮换该号码列表。虽然保留了一个号码,但不会再次分发。

一个简单的版本将仅基于“时间”;意味着预订在 X 分钟/小时后自动“消失”。如果那不起作用;您将不得不更进一步:在您的工作流程中找到可以取消保留号码以使它们再次“可用”的人/事。

除此之外,您似乎没有充分考虑当您有 N 个可用号码但同时有 N+x 个客户进来时会发生什么!没有循环/轮换......任何可以帮助你的东西!如果这种情况可能发生,那么您必须处理它并定义接下来应该发生什么!

关于java - 如何在多线程环境中以循环方式从列表中返回值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40503316/

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