Erstellen Sie eine Nachrichtenwarteschlange, an die N -Threads schreiben (die Anzahl der Threads wird über Argumente angegeben) und N -Threads, aus denen nur das Paket java.util.concurrent gelesen wird. Die Threadnamen müssen aussagekräftig sein, wenn Konstruktionen mit Warten/Benachrichtigung verboten sind.
Code: Select all
public class MessageQueueApp {
private static final int MESSAGE_COUNT = 5;
public static void main(String[] args) {
if (args.length < 1) {
System.err.println("Set number of threds through args");
return;
}
int threadCount;
try {
threadCount = Integer.parseInt(args[0]);
} catch (NumberFormatException e) {
System.err.println("Invalid format number: " + args[0]);
return;
}
BlockingQueue queue = new LinkedBlockingQueue();
ExecutorService writerPool = Executors.newFixedThreadPool(threadCount);
ExecutorService readerPool = Executors.newFixedThreadPool(threadCount);
// Writers
for (int i = 0; i < threadCount; i++) {
String writerName = "Writer-" + (i + 1);
writerPool.submit(() -> {
for (int j = 1; j {
int received = 0;
while (received < MESSAGE_COUNT) {
try {
String message = queue.take();
System.out.println(readerName + " got: " + message);
received++;
Thread.sleep(500); //Simulation
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
});
}
writerPool.shutdown();
readerPool.shutdown();
}
}
< /code>
Wenn ich Protokolle öffne, sehe ich: < /p>
Reader-6 got: Writer-1 message 1
Writer-1 put: Writer-1 message 1
< /code>
Warum der Leser vor dem Schriftsteller erscheint? Bedeutet das, dass meine App nicht so funktioniert, wie sie sollte? Oder ich sollte die Leser