我正在尝试编写一个 Java 串行设备驱动程序,并希望使用(对我来说新的)java.util.concurrent
包。我有一种发送数据包然后等待 ACK 的方法。我打算有炭。接收在不同的线程中运行。如果接收线程收到 ACK,它应该使用发送数据包函数通知线程。接收线程实现一个状态机,并应通知所有已解码数据包的监听器。
我想我知道如何使用直接线程、wait
、notify
等来做到这一点,但我不确定如何使用新的并发包来做到这一点。如果有任何指点,将不胜感激。
最佳答案
使用 CyclicBarrier
。以下是其 Javadoc 中的相关引用:
A synchronization aid that allows a set of threads to all wait for each other to reach a common barrier point. CyclicBarriers are useful in programs involving a fixed sized party of threads that must occasionally wait for each other. The barrier is called cyclic because it can be re-used after the waiting threads are released.
因此,您需要为多个 2
方创建一个 CyclicBarrier
,并让接收方线程在 ACK 和 ACK 后调用 await()
让发送者线程在执行 SEND 之前调用 await()
。
这是一个SSCCE让您开始。
package com.stackoverflow.q3379797;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Test {
public static void main(String[] args) {
CyclicBarrier barrier = new CyclicBarrier(2);
Receiver receiver = new Receiver(barrier);
Sender sender = new Sender(barrier);
ExecutorService executor = Executors.newFixedThreadPool(2);
executor.submit(receiver);
executor.submit(sender);
}
}
class Receiver implements Runnable {
private CyclicBarrier barrier;
public Receiver(CyclicBarrier barrier) {
this.barrier = barrier;
}
@Override
public void run() {
while (true) {
try {
// Wait for ACK (the sleep just simulates that).
Thread.sleep(2000);
System.out.println("ACK");
// Then notify.
barrier.await();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
class Sender implements Runnable {
private CyclicBarrier barrier;
public Sender(CyclicBarrier barrier) {
this.barrier = barrier;
}
@Override
public void run() {
while (true) {
try {
// Wait for notify.
barrier.await();
// Now do SEND.
System.out.println("SEND");
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
您将在标准输出中看到以下内容:
(2 seconds) ACK SEND (2 seconds) ACK SEND (2 seconds) ACK SEND
关于Java : threaded serial port read with Java. util.concurrent 线程访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3379797/