我正在尝试编写一个 Java 串行设备驱动程序并想使用(对我来说是新的)java.util.concurrent
包裹。我有一种发送数据包然后等待 ACK 的方法。我打算有炭。接收在不同的线程中运行。如果接收线程收到 ACK,它应该使用发送数据包函数通知线程。接收线程实现一个状态机,并应通知任何已解码数据包的侦听器。
我想我知道如何使用直接线程来做到这一点,wait
, notify
等等,但我不确定如何使用新的并发包来做到这一点。将非常感谢任何指点。
Use a CyclicBarrier http://download.oracle.com/javase/6/docs/api/java/util/concurrent/CyclicBarrier.html。以下是其 Javadoc 中的相关引用:
一种同步辅助工具,允许一组线程全部等待彼此到达公共障碍点。 CyclicBarriers 在涉及固定大小的线程组且偶尔必须相互等待的程序中非常有用。屏障被称为循环屏障,因为它可以在等待线程被释放后重新使用。
所以,你需要创建一个CyclicBarrier
对于一些2
各方并让接收者线程调用await()
ACK 之后并让发送者线程调用await()
在执行发送之前。
这是一个SSCCE http://sscce.org让您开始。
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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)