Процедурные операции сбора в поток Java или реактивный поток - PullRequest
0 голосов
/ 02 июля 2018

Как преобразовать этот процедурный Java-код "старого стиля" в как минимум потоки Java 8 или реактивные потоки, используя Flux и Mono. Моя цель - создать хорошие основы для использования этого кода в параллельной неблокирующей веб-среде.

Я хочу иметь постоянное количество Elem элементов во всей системе и в то же время меньшее или большее количество places доступных для этих элементов.

Визуально это может выглядеть примерно так для 8 элементов, 12 мест и 3 объектов (каждый из которых содержит свой собственный список Elem с):

s1 [Elem(1), Elem(2), Elem(3), Elem(4)]
s2 [Elem(5), Elem(6), Elem(7), Elem(8)]
s3 [FREE, FREE, FREE, FREE]

вызов для s1 requestElem()
позвоните по s1 requestElem()
звоните по s2 requestElem()

s1 [Elem(1), Elem(2), FREE, FREE]
s2 [Elem(5), Elem(6), Elem(7), FREE]
s3 [FREE, FREE, FREE, FREE]

... и в настоящее время эти три элемента ожидают возврата в случайном порядке ...

вызов для s3 returnElem(4)
позвоните по s3 returnElem(8)
позвоните по s3 returnElem(2)

s1 [Elem(1), Elem(2), FREE, FREE]
s2 [Elem(5), Elem(6), Elem(7), FREE]
s3 [Elem(4), Elem(8), Elem(3), FREE]

Конечно, порядок этих операций может быть другим и выбираться случайным образом.

class MyClass {
    private String name;
    private final int size = 4;     // size of s1, s2, s3
    private BlockingDeque<Elem> places;
    private int numOfElem;
    private BlockingDeque<Elem> additionalElems;

    public void requestElem() {
        if (numOfElem > size) {
            numOfElem--;
            additionalElems.pop();
            return;
        }
        if(!places.isEmpty()){
            places.pop();
            numOfElem = places.size();
        } else {
            System.out.println("empty: " + name + ", waiting for new elements...");
        }
    }

    public void returnElem(int id) {
        if (numOfElem >= size) {
            numOfElem++;
            additionalElems.push(new Elem(id));
            return;
        }
        if(places.size() < size){
            places.push(new Elem(id));
            numOfBicycles = places.size();
        }
    }

}

Возможно ли это? Можете ли вы дать мне несколько полезных советов или ресурсов?

...