有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    我会尝试更递归地执行它,而不是使用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传递当前的/max索引,而不是使用类变量来保存数据,那会更简洁,但我对这些类还不太熟悉,不知道这是否可行

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

    write(0, 10);