Приветствую всех.
Разбираюсь с многопоточностью в java, и пытаюсь решить следующую задачу.
Есть два списка, в одном хранятся некоторые объекты, в другом треды. На первом этапе, предположим, что объекты не изменяются, и список в котором они хранятся тоже не изменяется. Для ясности предположим, что у меня пять тредов и миллиард объектов в другом списке.
Мне нужно гарантировать последовательный обход элементов списка тредами, т.е.:
- первый элемент обрабатывается thread1 (остальные четыре ждут);
- thread1 переходит на 2ой элемент, thread2 обрабатывает 1ый (три ждут);
- thread1 на 3, thread2 на 2, thread3 на освободившийся 1 и т.д.
При этом потоки не должны «обгонять» друг друга — сначала по элементам проходит thread1, потом thread2 и т.д.
Synchronized гарантирует, что с некоторым куском кода будет работать только один поток. Мне нужно гарантировать, не просто доступ к объекту одного потока, а потока с конкретным номером.
Готового кода не прошу, подскажите по алгоритму решения, и какие примитивы синхронизации лучше использовать.
На втором этапе, планирую менять значения полей объектов в обрабатываемом списке, удалять элементы из списка и убивать потоки. Т.е. в какой-то момент может остаться работающими (например): thread2, thread3 и thread5, но последовательность обхода должна остаться та же (2 обходит все, затем 3, и затем 5).
Любые подсказки и ссылки категорически приветствую.