by Anonymous » 20 May 2025, 13:41
Ich übe mit Multithreading. Ich habe eine Aufgabe: < /p>
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
und Autoren in eine Schleife platzieren? Welche Korrekturen sollte ich vornehmen?
Ich übe mit Multithreading. Ich habe eine Aufgabe: < /p>
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]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 [/code] und Autoren in eine Schleife platzieren? Welche Korrekturen sollte ich vornehmen?