Java : threaded serial port read with Java. util.concurrent 线程访问

标签 java multithreading concurrency serial-port

我正在尝试编写一个 Java 串行设备驱动程序,并希望使用(对我来说新的)java.util.concurrent 包。我有一种发送数据包然后等待 ACK 的方法。我打算有炭。接收在不同的线程中运行。如果接收线程收到 ACK,它应该使用发送数据包函数通知线程。接收线程实现一个状态机,并应通知所有已解码数据包的监听器。

我想我知道如何使用直接线程、waitnotify 等来做到这一点,但我不确定如何使用新的并发包来做到这一点。如果有任何指点,将不胜感激。

最佳答案

使用 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/

相关文章:

multithreading - 使用多线程处理硬盘驱动器上的文件有用吗?

java - Java 数组快速排序中的堆栈溢出

java - 如何防止在类的实例上调用静态方法?

ios - dispatch_async 和异步请求的问题

concurrency - Go语言中临界区的交替执行

java - Java 中是否可以进行 "atomic"中断检查?

c++ - QThreads 的并发问题。接收相同信号的线程相互阻塞

java - Android - 如何使用索引处的对象解析 json

java - 将 LocalDate 解析为 hashMap Token

c++ - 将数据从调用者线程传递到另一个 boost::thread 中的方法