Это действительно зависит от вашего общего дизайна.
Простое решение будет работать так:
- у вас есть 1-ниточный прайм-генератор и n потоков-прайм-тестеров
- изначально все прайм-тестеры звонят
wait()
- каждый раз, когда главный генератор добавляет новое простое число, он уведомляет все простые тестеры
- каждый тестер проверяет, существует ли его номер (или больше один), если тестировщик либо нашел свой номер, либо знает, что "нет". Если нет, он снова вызывает
wait()
.
Огромное преимущество этого решения: прайм-генератору не нужно знать, сколько существует прайм-тестеров. Он просто уведомляет все потоки, ожидающие на общем мониторе.
Кроме того, прайм-генератор может точно знать, какие существуют прайм-тестеры, а также, за какое число они отвечают. Поэтому вместо того, чтобы разбудить всех тестеров, он уведомит только того, кого нужно знать.
Пожалуйста, поймите: вы только дали некоторые смутные требования, без какого-либо кода. Таким образом, вы получите какой-то расплывчатый ответ без какого-либо кода. Мой ответ подразумевает вдохновение, чтобы направлять ваши следующие шаги в домашней работе.
И просто для записи: если вы хотите использовать действительно большие простые числа, тогда использование списка - плохой выбор. Предположим, ваш список содержит 1 миллион простых чисел. Стоимость звонка contains()
будет расти линейно с количеством записей. Поэтому лучше использовать коллекцию, которая позволяет быстро находить элементы (своего рода набор / дерево), но также обеспечивает быстрый доступ к текущему «последнему» (наибольшему) числу в коллекции.