Как преобразовать этот процедурный 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();
}
}
}
Возможно ли это? Можете ли вы дать мне несколько полезных советов или ресурсов?