代码之家  ›  专栏  ›  技术社区  ›  fred basset

Java:线程串行端口读取,Java.util.concurrent线程访问

  •  2
  • fred basset  · 技术社区  · 14 年前

    我正在尝试编写一个Java串行设备驱动程序,并希望使用(对我来说是新的) java.util.concurrent 包裹。我有一个方法,发送一个包,然后等待一个确认。我打算要一个char。接收是另一条线索。如果接收线程得到一个ACK,它应该用send packet函数通知线程。接收线程实现一个状态机,并且应该通知任何侦听器已解码的数据包。

    我想我知道如何使用直接线程, wait , notify 等等,但我不知道如何使用新的并发包来实现这一点。如果有人指点我将不胜感激。

    1 回复  |  直到 14 年前
        1
  •  4
  •   BalusC    14 年前

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

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

    所以,你需要创建一个 篱栅 2 并让接收方线程调用 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();
                }
            }
        }
    }
    

    您将在stdout中看到以下内容:

    (2 seconds)
    ACK
    SEND
    (2 seconds)
    ACK
    SEND
    (2 seconds)
    ACK
    SEND