【问题标题】:Java : threaded serial port read with Java.util.concurrent thread accessJava:使用 Java.util.concurrent 线程访问读取线程串行端口
【发布时间】:2010-08-08 21:07:46
【问题描述】:

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

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

【问题讨论】:

    标签: java multithreading concurrency serial-port


    【解决方案1】:

    使用CyclicBarrier。以下是其 Javadoc 中的相关引用:

    一种同步辅助工具,它允许一组线程相互等待以达到一个共同的障碍点。 CyclicBarriers 在涉及固定大小的线程组的程序中很有用,这些线程组必须偶尔相互等待。屏障被称为循环的,因为它可以在等待线程被释放后重新使用。

    因此,您需要为多个2 方创建一个CyclicBarrier,并让接收线程在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 秒) 确认 发送 (2 秒) 确认 发送 (2 秒) 确认 发送

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-20
      • 2017-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多