Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在多线程环境中以循环方式从列表返回值?_Java_Multithreading_Stateless Session Bean - Fatal编程技术网

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

Java 如何在多线程环境中以循环方式从列表返回值?,java,multithreading,stateless-session-bean,Java,Multithreading,Stateless Session Bean,我必须编写一段代码,其中包括异步地对后端进行web服务调用,并以循环方式从TFN列表向调用方返回免费电话号码。下面是我的代码 @Stateless public class TollFreeServiceBean { @EJB private AsyncBackendService asyncBean; public long getTollFreeNumber(Request request) { //Validate request

我必须编写一段代码,其中包括异步地对后端进行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个客户应收到第2个TFN,以此类推

后端系统抱怨两个不同的客户同时登录到同一个TFN。因此,我认为我的TFNUtil.getNext()逻辑不正确


有人能指出这里的错误吗?

你的说法自相矛盾

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

另一方面,你有目的地把一个系统放在适当的位置,这将完全做到这一点

您可以看到,这取决于列表
tfnList
中有多少元素。。。您的方法
getNext()
可能会很快“溢出”。那么你认为接下来会发生什么

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

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


<>和之后,似乎你没有充分考虑当你的N个数字可用时应该发生什么,但是N+X客户同时进来!没有循环/轮换。。。有什么能帮到你的!如果这种情况是可能的,那么你必须处理它,然后定义应该发生什么

我认为if(tfnList.size()>=index){=0;}子句有问题。假设每次索引大于列表大小时,它都返回0。因此,在没有任何CUSOMTER等于列表大小后,返回0。您能解释更多关于tfnListYes的信息吗?在客户数量等于列表大小之后,我们要向列表大小之后的客户发送第一个tfn。这就是我提到循环赛的原因。是的。那么,当没有超过列表大小的客户时,逻辑应该是什么呢。系统假定第一个登录的用户超时。此外,还可能假设没有客户11,只有TFN 3可用。您可以使用TFN3而不是TFN1,对吗?你不能使用动态增长列表。当用户数大于TFN时,我们将为TFN提供一轮服务。两个客户始终可以获得相同的TFN问题出现,即即使在没有加载的情况下发生了两个客户呼叫,后端也会获得此信息。你的更新没有帮助。这并不能解释为什么你会对一个可以返回相同数字给两个人的方法感到惊讶。。。确实如此。如果你的10个号码正在使用中,而你把号码1发给了第11个客户,你期望会发生什么?!还可以看看我的最新更新!我的意思是两个客户同时获得相同的TFN。这就是后端系统所抱怨的。我只想检查/审阅代码,确保代码按预期工作。使用线程池执行器编写测试用例,并测试TFNutils类once@shashank你能给我举一个如何使用线程池执行器的例子吗?或者你能告诉我具体怎么做吗?那会有帮助的。做这样的实验是没有意义的。代码是线程安全的,问题出在坏的设计上。此外:定义一个有用的多线程测试用例将非常困难。你知道:通过测试的案例。。。这毫无意义。因为可能有其他线程方案会导致失败。但正如所说:问题不在于代码有多线程问题!整个系统出现故障!