Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/378.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_Asynchronous_Executable_Deferred Execution - Fatal编程技术网

Java 在方法返回后执行某些操作

Java 在方法返回后执行某些操作,java,asynchronous,executable,deferred-execution,Java,Asynchronous,Executable,Deferred Execution,这是我在伪代码中的情况: function onRequest() { receiveConnectionRequest(); response = function onConnect() { playersConnected++; if (playersConnected == 4) { sendAllPlayersTheirCards() } return OK; }();

这是我在伪代码中的情况:

function onRequest() {
    receiveConnectionRequest();

    response = function onConnect() {
        playersConnected++;
        if (playersConnected == 4) {
            sendAllPlayersTheirCards()
        }
        return OK;
    }();

    sendResponse(response);

}
当玩家1-3连接时,他们将被添加到玩家列表中,并返回OK,此时他们将在自己的一侧设置装备。然而,当玩家4连接时,在发送对其请求的响应之前,所有玩家都会收到他们的卡。由于玩家4尚未收到对其请求的响应,因此他尚未正确初始化,并且在收到卡时出现错误

我想要的是:

function onRequest() {
    receiveConnectionRequest();

    response = function onConnect() {
        playersConnected++;
        if (playersConnected == 4) {
            plan(sendAllPlayersTheirCards())
        }
        return OK;
    }();

    sendResponse(response);

    executePlanned() // now cards are sent
}
这有一个普遍的模式吗?onConnect函数位于不同的类中,不应该知道onRequest的实现细节


我特别尝试在Java中实现这一点,但欢迎使用通用解决方案。

您不能先发送响应,然后再执行“if(playersConnected)”检查吗?

我不确定您在这里使用的这种闭包语法。您可以用它来代替吗

function onRequest() {
    playersConnected++;

    sendResponse(OK);

    if (playersConnected == 4) {
        sendAllPlayersTheirCards()
    }
}

有很多很好的解决方案,但我建议使用回电

不要将其视为在方法返回后执行某些操作,而应将其视为回调以报告状态或触发事件

在Java中搜索事件模式或回调


与非常相似。

这似乎是一个相关的教程:


我可以这样做:

function onRequest(request) {

 game.handleRequest(request, function(response) {
  sendResponse(response);
 }

}

class game
function handleRequest(request, sendResponse:Function) {
 players++;
 sendResponse(OK);
 if (players == 4) sendCards();
}

看起来像delegation.plan()在这里设置委派和executePlanned()正在调用排队操作。我不能,因为处理请求接收和响应发送的代码是通用程序包的一部分,而执行PlayerConnection++的代码是另一个特定于游戏的程序包的一部分。在我当前的设置中,响应必须由检查是否所有玩家都已注册的函数返回有联系的