Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.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_Callback_Synchronization - Fatal编程技术网

Java 将多个回调处理为一个接收方函数的最有效方法

Java 将多个回调处理为一个接收方函数的最有效方法,java,callback,synchronization,Java,Callback,Synchronization,我有一个异步API,它通过回调方法提供输出 现在,我必须同时调用这个API N次,然后等待N次对回调方法的点击/回调 为了实现这一点,我目前使用了计数器和同步方法 @Override public synchronized void onResponseReceived() { receivedCount++; if (receivedCount == totalCount){ onCallbacksComplete();

我有一个异步API,它通过回调方法提供输出

现在,我必须同时调用这个API N次,然后等待N次对回调方法的点击/回调

为了实现这一点,我目前使用了计数器和同步方法

@Override
    public synchronized void onResponseReceived() {
       receivedCount++;


        if (receivedCount == totalCount){
            onCallbacksComplete();
        }
    }
我想知道,是否有更快的方法实现上述目标


谢谢。

如果同步方法只是为了确保totalCount变量的准确性,您也可以为该变量使用类,该类是线程安全的,并为您提供该功能。然后可以删除onResponseReceived方法的synchronized修饰符,这将使同步块更小,并提供更好的性能

您可能还希望对接收的计数使用原子整数类

我希望这有助于使用


这避免了同步。

听起来像是执行器和
倒计时锁存器的教科书案例(或者
循环载波
,如果重复的话)。
AtomicInteger receivedCount= new AtomicInteger();
@Override
public void onResponseReceived() {
    if (receivedCount.incrementAndGet() == totalCount){
        onCallbacksComplete();
    }
}
AtomicInteger receivedCount= new AtomicInteger(totalCount);
@Override
public void onResponseReceived() {
    if (receivedCount.decrementAndGet() == 0){
        onCallbacksComplete();
    }
}