在方法完成之前循环如何继续?

How can loop continue before method is finished?

我的程序中有多个线程(可运行)。主题之一是处理 RS232 通信。 我的问题是循环内的代码没有按照写入的顺序执行:

while(!serialData.dataToSend.isEmpty())
{
    try {
        SerialMsgToSend msgObject = serialData.dataToSend.remove();
        if(msgObject.type == msgObject.HOLDING_REGISTER)
        {
            Thread.sleep(COMMAND_WAIT_TIME);
            Toolkit.getDefaultToolkit().beep();
            modBusManager.singleRegisterWriteToMultipleRegisters(msgObject.unit, msgObject.startRegisterAdress, msgObject.data);
        }
        else if(msgObject.type == msgObject.COIL)
        {
            Thread.sleep(COMMAND_WAIT_TIME);
            Toolkit.getDefaultToolkit().beep();
            modBusManager.writeToCoil(msgObject.unit, msgObject.startRegisterAdress, msgObject.data[0] == 1);
        }
        Thread.sleep(5000);
        readUnitsData(msgObject.unit);
        Thread.sleep(5000);
        if(msgObject.RESPONSE > 0)
        {
            serialData.listeners[msgObject.unit - 1].sendResponseToServer(msgObject.RESPONSE);
        }
    } catch (Exception ex) {
        log.error("Exception on sending data: " + ex.toString());
    }
}

首先我通过调用写入 ModBus 寄存器:

modBusManager.singleRegisterWriteToMultipleRegisters(msgObject.unit, msgObject.startRegisterAdress, msgObject.data);

之后我想等待 5 秒寄存器更新,然后读取它们并将信息发送到服务器。

我用调用方法读取数据:

readUnitsData(msgObject.unit);

然后我使用侦听器告诉另一个线程将数据发送到服务器:

serialData.listeners[msgObject.unit - 1].sendResponseToServer(msgObject.RESPONSE);

我的问题是数据在得到 read/updated 之前被发送到服务器,所以我发送旧数据。我习惯于按照编写的顺序执行代码。我是不是以错误的方式使用线程或者可能是什么问题?

这是我调用读取数据的方法:

private void readUnitsData(int unitID) 
{
    if(mtxData.climatList[unitID] != null)
    {
        try 
        {
            log.info("Serial reading data for: " + unitID);
            int[] coils = modBusManager.readCoils(unitID + 1,0,87);
            String[] holding = modBusManager.readHoldingRegisters(unitID + 1,0,64); //(int slaveAdress, int registerAdress, int registerQuntaity)
            if(coils != null && holding != null)
            {
                System.out.println("send to listner: "  + unitID);
                serialData.listeners[unitID].newHoldingAndCoilData(holding, coils);
            }
        } catch (Exception ex) 
        {
            log.error("Exception on run: " + ex.toString());
        }
    }
}

以及连接到侦听器的其他可运行对象中的方法:

@Override
public void sendResponseToServer(int responseType) 
{
    try
    {
        log.info("listener for sendStatusToServer called: " + responseType);
        Thread.sleep(15000);
        switch(responseType)
        {
            case 1:
                communicationManager.sendStatus();
                break;
            case 2:
                communicationManager.sendSettings();
                break;
        }
    }catch(Exception ex)
    {
        log.error("Exception on sendResponseToServer: " + ex);
    }
}

我确实喜欢@Markus Mitterauer 提出的建议并拆解了代码。我发现这是错误的 unitID 之一的问题。因此,我在读取寄存器时没有得到任何值,并且没有正确触发侦听器。