我正在使用 RXTX 库将一些数据发送到串口。发送数据后,我必须等待 1 秒才能收到 ACK。我使用 ArrayBlockingQueue 实现了这个功能:
例如。
val queue = ArrayBlockingQueue(1)
def send(data2Send : Array[Byte]) : Array[Byte]{
out.write(data2Send)
queue.poll(1000)
}
def receive(receivedData : Array[Byte]){
queue.add(receivedData)
}
这工作得很好,但是因为我正在学习 Scala,所以我想使用插入线程和锁定结构的 Actor。
我的第一次尝试如下:
class Serial {
sender = new Sender(...)
new Receiver(...).start
class Sender {
def send(data2Send : Array[Byte]) : Array[Byte]{
out.write(data2Send)
receiveWithin(WAIT_TIMEOUT_MILLIS) {
case response => response
case TIMEOUT => null
}
}
}
class Receiver extends Actor{
def act{
loop{
sender ! read()
}
}
}
}
但是这段代码抛出了 java.lang.AssertionError: assertion failed: 从属于其他参与者的通道接收。我认为问题在于我不能在行为定义之外使用接收或反应。我遵循的方法是正确的吗?
第二次尝试:
class Serial {
new Sender(...).start
new Receiver(...).start
def send() = (sender ?! data2Send).asInstanceOf(Array[Byte])
class Sender {
def act() {
loop{
receive{
out.write(data2Send)
receiveWithin(WAIT_TIMEOUT_MILLIS) {
case response => response
case TIMEOUT => null
}
}
}
}
}
class Receiver extends Actor{
def act{
loop{
sender ! read()
}
}
}
}
在第二次尝试中,我得到 java.util.NoSuchElementException: head of empty list when sender !read() 行被执行。它看起来要复杂得多