Java: чтение последовательного последовательного порта с доступом к потоку Java.util.concurrent - PullRequest
2 голосов
/ 01 августа 2010

Я пытаюсь написать драйвер последовательного устройства Java и хочу использовать (новый для меня) пакет java.util.concurrent.У меня есть один метод, который отправляет пакет, а затем ждет подтверждения.Я планирую иметь полукокса.прием запускается в другой ветке.Если принимающий поток получает ACK, он должен уведомить поток с помощью функции отправки пакета.Получающий поток реализует конечный автомат и должен уведомлять всех слушателей о декодированных пакетах.

Я думаю, что знаю, как это сделать, используя прямые потоки, wait, notify и т. Д., Но не уверен, каксделать это с новым параллельным пакетом.Буду очень признателен за любые указатели.

1 Ответ

4 голосов
/ 01 августа 2010

Используйте CyclicBarrier.Вот пример релевантности из его Javadoc:

Средство синхронизации, которое позволяет всем потокам ожидать друг друга, чтобы достичь общей барьерной точки.CyclicBarriers полезны в программах, включающих группу потоков фиксированного размера, которые иногда должны ждать друг друга.Барьер называется циклическим, поскольку его можно использовать повторно после освобождения ожидающих потоков.

Итак, вам нужно создать CyclicBarrier для ряда 2 сторон и позволить потоку-получателю вызывать await() после ACK и позволить потоку-отправителю вызывать 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...