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