java 中方法和侦听器之间的同步执行

Synchronous execution between methods and listener in java

假设我必须连续写入 10 次串口。

for (int i = 1; i <= 10; i++) {
     serialPort.writeInt(i);
// wait until SerialPortEventListener receives something then write again
    }

或:

void writeMoreDate(){
         serialPort.writeInt(something);
    // wait until SerialPortEventListener receives something then write again
         serialPort.writeInt(something;
    // wait until SerialPortEventListener receives something then write again
         serialPort.writeInt(something);
}

我有一个串行端口事件侦听器,每次我向它写入内容时都会触发它,并调用 .map() 方法。

 @Override
    public void serialEvent(SerialPortEvent event) {
        if (event.isRXCHAR() && event.getEventValue() > 0) {

 //when data arrived do something and notify that next method can execute!            
        } 
    }

如何让方法等待 serialEvent 接收到一些东西?

-这就是我使用 java.util.concurrent.Semaphore 处理此问题的方式:

例如:

  Semaphore semaphore = new Semaphore(MAX_CONCURRENT_THREADS, true);

        void writeMoreDate(){
           Runnable runnable () -> { 
             serialPort.writeInt(something);
             semaphore.acquire();
             serialPort.writeInt(something;
             semaphore.acquire();
             serialPort.writeInt(something);
             semaphore.acquire();
            }
               new Thread(runnable).start();
           }

在串行侦听器上:

 @Override
    public void serialEvent(SerialPortEvent event) {
        if (event.isRXCHAR() && event.getEventValue() > 0) {
               semaphore.release();
        } 
    }

但我不确定这是否是正确的解决方案。谢谢。

我会尝试更递归地做,而不是使用 for 循环。大致如下:

private int activeIndex = -1;
private int maxIndex = -1;

private void write(int currentIndex, int maxIndex){
    if(maxIndex < currentIndex)
        return;

    activeIndex = currentIndex;
    maxIndex = maxIndex;

    serialPort.writeInt(currentIndex);
}

然后在您的事件侦听器中,您将在上一个事件完成后触发下一个写入事件...

public void serialEvent(SerialPortEvent event) {
    if (event.isRXCHAR() && event.getEventValue() > 0) {
        .....

        write(activeIndex + 1, maxIndex);
    } 
}

如果你能以某种方式通过 SerialPortEvent 传递 current/max 索引而不是使用 class 变量来保存数据,那会更干净,但我对那些 class想知道这是否可能。

因此,根据您的示例,您可以将其用于:

write(0, 10);