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

时间:2016-08-12 13:57:33

标签: java listener synchronous jssc

假设我必须连续写入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();
        } 
    }

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

1 个答案:

答案 0 :(得分:0)

我会尝试更多地递归而不是使用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传递当前/最大索引而不是使用类变量来保存数据,那将会更加清晰,但我不熟悉这些类以了解是否可能。

因此,从您的示例中,您可以将其用于:

write(0, 10);