【发布时间】:2020-06-27 05:57:58
【问题描述】:
在下面的这段代码中,多个生产者线程有时会生成相同的素数。如何确保不同的生产者始终生成唯一的素数?
public class UniquePrimes {
private static BlockingQueue<Integer> linkedBlockingQueue = new LinkedBlockingQueue<Integer>();
static ConcurrentHashMap<Integer, String> primesproduced = new ConcurrentHashMap<Integer, String>();
public static void main(String[] args) {
Scanner reader = new Scanner(System.in);
System.out.print("Enter number of threads you want to create: ");
int NOOFTHREADS = reader.nextInt();
reader.close();
ExecutorService executorPool = Executors.newFixedThreadPool(NOOFTHREADS);
AtomicInteger currentPrime = new AtomicInteger();
Runnable producer = () -> {
String threadName = Thread.currentThread().getName();
int p = 0;
try {
p = generateNextPrime(currentPrime.incrementAndGet());
linkedBlockingQueue.put(p);
primesproduced.put(p, threadName);
System.out.println("Thread " + threadName + " produced prime number " + p);
} catch (InterruptedException e) {
e.printStackTrace();
}
};
List<Runnable> tasks = new ArrayList<Runnable>();
for (int i = 0; i < NOOFTHREADS; i++) {
tasks.add(producer);
}
CompletableFuture<?>[] futures = tasks.stream().map(task -> CompletableFuture.runAsync(task, executorPool))
.toArray(CompletableFuture[]::new);
CompletableFuture.allOf(futures).join();
executorPool.shutdown();
System.out.println("\nTotal unique primes produced: " + primesproduced.size() + " and they are: ");
System.out.print(
primesproduced.entrySet().stream().filter(map -> map.getKey().intValue()>0).map(k -> "[" + k + "]").collect(Collectors.joining(",")));
}
}
private static int generateNextPrime(int currentPrime) {
currentPrime++;
if (currentPrime < 2) {
currentPrime = 2;
return currentPrime;
}
for (int i = 2; i < currentPrime; i++) {
if (currentPrime % i == 0) {
currentPrime++;
i = 2;
} else {
continue;
}
}
return currentPrime;
}
}
目前,多个生产者可以生成相同的质数。 我如何确保每个生产者都产生一个以前没有其他生产者产生的新质数?
感谢您的帮助。
【问题讨论】:
标签: java multithreading java.util.concurrent