Java:通过Java.util.concurrent线程访问读取线程化串行端口
我正在尝试编写Java串行设备驱动程序,并希望使用(对我来说是新的)Java:通过Java.util.concurrent线程访问读取线程化串行端口,java,multithreading,concurrency,serial-port,Java,Multithreading,Concurrency,Serial Port,我正在尝试编写Java串行设备驱动程序,并希望使用(对我来说是新的)Java.util.concurrent包。我有一种方法,发送一个数据包,然后等待确认。我打算要一份char。接收以不同的线程运行。如果接收线程收到ACK,它应该使用发送数据包函数通知线程。接收线程实现了一个状态机,应该通知任何侦听器已解码的数据包 我想我知道如何使用直接线程、wait、notify等来实现这一点,但不知道如何使用新的并发包来实现这一点。非常感谢您的指点。请使用。以下是其Javadoc中的相关引用: 一种同步辅助
Java.util.concurrent
包。我有一种方法,发送一个数据包,然后等待确认。我打算要一份char。接收以不同的线程运行。如果接收线程收到ACK,它应该使用发送数据包函数通知线程。接收线程实现了一个状态机,应该通知任何侦听器已解码的数据包
我想我知道如何使用直接线程、wait
、notify
等来实现这一点,但不知道如何使用新的并发包来实现这一点。非常感谢您的指点。请使用。以下是其Javadoc中的相关引用:
一种同步辅助工具,允许一组线程都等待对方到达一个共同的障碍点。CyclicBarrier在涉及固定大小的线程组的程序中很有用,这些线程有时必须互相等待。该屏障被称为循环屏障,因为它可以在释放等待的线程后重新使用
因此,您需要为多个2
参与方创建CyclicBarrier
,让接收方线程在确认后调用await()
,让发送方线程在发送前调用await()
这是一个让你开始的方法
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
(2秒)
阿克
发送
(2秒)
阿克
发送
(2秒)
阿克
发送