Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:通过Java.util.concurrent线程访问读取线程化串行端口_Java_Multithreading_Concurrency_Serial Port - Fatal编程技术网

Java:通过Java.util.concurrent线程访问读取线程化串行端口

Java:通过Java.util.concurrent线程访问读取线程化串行端口,java,multithreading,concurrency,serial-port,Java,Multithreading,Concurrency,Serial Port,我正在尝试编写Java串行设备驱动程序,并希望使用(对我来说是新的)Java.util.concurrent包。我有一种方法,发送一个数据包,然后等待确认。我打算要一份char。接收以不同的线程运行。如果接收线程收到ACK,它应该使用发送数据包函数通知线程。接收线程实现了一个状态机,应该通知任何侦听器已解码的数据包 我想我知道如何使用直接线程、wait、notify等来实现这一点,但不知道如何使用新的并发包来实现这一点。非常感谢您的指点。请使用。以下是其Javadoc中的相关引用: 一种同步辅助

我正在尝试编写Java串行设备驱动程序,并希望使用(对我来说是新的)
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秒) 阿克 发送