Hier ist der Code:Kann ich Collection.size() verwenden, um den Zähler in diesem Code zu ersetzen?
public class LogService {
private final BlockingQueue<String> queue;
private final LoggerThread loggerThread;
private final PrintWriter writer;
@GuardedBy("this") private boolean isShutdown;
@GuardedBy("this") private int reservations; // <-- counter
public void start() { loggerThread.start(); }
public void stop() {
synchronized (this) { isShutdown = true; }
loggerThread.interrupt();
}
public void log(String msg) throws InterruptedException {
synchronized (this) {
if (isShutdown)
throw new IllegalStateException(...);
++reservations;
}
queue.put(msg);
}
private class LoggerThread extends Thread {
public void run() {
try {
while (true) {
try {
synchronized (LogService.this) {
if (isShutdown && reservations == 0)
break;
}
String msg = queue.take();
synchronized (LogService.this) {
--reservations;
}
writer.println(msg);
} catch (InterruptedException e) { /* retry */ }
}
} finally {
writer.close();
}
}
}
}
Es ist ein Ausschnitt aus dem Buch Java Concurrency in Practice, und ich bin darüber nachgedacht vielleicht der Zähler reservations
unnötig ist, da wir einfach queue.size()
verwenden könnte die Zahl der bekommen Elemente in queue
.
Bin ich richtig?
Warteschlange 'put' und' get' ist nicht synchronisiert. 'Änderung der Reservierung 'ist. –