Pisze program korzystając z wzorca producer worker i nie bardzo wiem jak wyciągać z kolejki dane które tam wrzucam. Oczywiście nadaje każdemu rządaniu unikalne id, ale jedyny sposób na uzyskanie tych samych danych z powrotem jaki mi przyhodzi do głowy to pętla while(listIn.size() != listOut.size()) lecz wiem, że to rozwiązanie niesie ze sobą wiele błędów i nie jest poprawne.
Klasa przechowująca referencje do kolejek:
public class Queue {
private static final Integer QUEUE_SIZE = 1024;
public static final BlockingQueue<Pair<String, String>> URL_QUEUE = new ArrayBlockingQueue<>(QUEUE_SIZE);
public static final BlockingQueue<Pair<String, byte[]>> REQUEST_QUEUE = new ArrayBlockingQueue<>(QUEUE_SIZE);
public static final BlockingQueue<Pair<String, String>> ANSWERS = new ArrayBlockingQueue<>(QUEUE_SIZE);
}
Metoda wstawiająca dane i zwracająca przekonwertowane:
@Override
public List<String> getBase64(List<String> urls) {
String uniqueRequestID = UUID.randomUUID().toString();
urls.parallelStream()
.forEach(url -> {
try {
Queue.URL_QUEUE.put(new Pair<>(uniqueRequestID, url));
} catch (InterruptedException e) {
e.printStackTrace();
}
});
List<String> base64 = new ArrayList<>(urls.size());
while (base64.size() != urls.size()) {
try {
Pair<String, String> answer = Queue.ANSWERS.take();
if (answer.getKey().equals(uniqueRequestID)) {
base64.add(answer.getValue());
} else {
Queue.ANSWERS.put(answer);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return base64;
}
Może zmiana kolejki przechowującej odpowiedzi na mape, a konkretnie concurrenthashmap jest dobrym pomysłem?