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。同时发生的信号量:
例:
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 楼答案
我会尝试更递归地执行它,而不是使用for循环。大致如下:
然后在事件侦听器中,在最后一个事件完成后触发下一个写事件
如果你能通过SerialPortEvent传递当前的/max索引,而不是使用类变量来保存数据,那会更简洁,但我对这些类还不太熟悉,不知道这是否可行
因此,从您的示例中,您可以将其用于: