У меня есть многопоточная программа, в которой один поток читает данные, а несколько других выполняют работу над этими данными. Если у меня есть один записывающий поток, непрерывно добавляющий данные (Example.add()
), а другие потоки считывателей последовательно считывают эти данные (Example.getData(1)
, Example.getData(2)
, ...), что является лучшим способом блокировать читателей до тех пор, пока не будут доступны данные по индексу, который они запрашивают ?Заблокировать до тех пор, пока элемент не будет доступен
Эта проблема похожа на производителя-потребителя, но я не хочу «потреблять» данные.
public class Example {
private ArrayList<Integer> data;
public Example() {
data = new ArrayList<Integer>();
}
public int getData(int i) {
// I want to block here until the element
// index i is available.
return data.get(i);
}
public void add(int n) {
data.add(n);
}
}
Это звучит, как вы хотите, либо 'Future' (встроенный в Java, но более ограниченный) или' Promise' (новее, и часть спецификации реактора). – chrylis