Ich lese B. Goetz JCIP und stoßen auf einige Missverständnisse im Abschnitt 7.2 über cancellin Thread-basierte Dienste. Hier ist der Code:Verständnis Shutdown angefordert Flag beim Herunterfahren
public class LogWriter{
private final BlockingQueue<String> queue;
private final LoggerThread logger;
public LogWriter(Writer writer){
this.queue = new LinkedBlockingQueue<String>(CAPACITY);
this.logger = new LoggerThread(writer);
}
public void start(){ logger.start(); }
public void log(String msg) throws InterruptedException {
queue.put(msg);
}
private class LoggerThread extends Thread {
private final PrintWriter writer;
public void run() {
try{
while(true)
writer.println(queue.take());
} catch(InterruptedException ignored){
} finally {
writer.close();
}
}
}
Er sagte, dass solche Service bietet keine Möglichkeit, es zu beenden. Er gibt eine andere Alternative dazu:
public void log(String msg) throws InterruptedException {
if(!shutdownRequested)
queue.put(msg);
else
throw new IllegalArgumentException("logger is shut down");
}
Jetzt sagt er, dass
Die Implementierung von Protokoll ist Chek-als-act sequnce: Hersteller können beobachten, dass der Dienst noch nicht geschlossen worden, nach unten, aber immer noch Warteschlange Nachrichten nach dem Herunterfahren, wieder mit dem Risiko, dass der Hersteller möglicherweise im Protokoll blockiert werden und niemals entsperrt werden.
Das betonte ist mir nicht klar.
Wenn der Verbraucher die Warteschlange zu einer Sammlung entleerte, werden alle Hersteller gesperrt in log()
entsperrt. Selbst wenn einige Produzenten versuchen, eine Protokollnachricht in die Warteschlange zu stellen, wird sie nicht blockiert. Das einzige, was ich sehe, ist, dass diese Nachricht nicht protokolliert wird, da die Warteschlange leer ist.
FRAGE: Warum tut er sagt, dass die Hersteller blockiert werden mught und nie freigeschaltet. Was habe ich verpasst?
Können Sie den vollständigen Code veröffentlichen? Wird 'shutdownRequested' nur in' log' Methode oder auch im Logger Thread verwendet? – Joni
@Joni Das ist der volle. Er hat nicht mehr Details angegeben. –
@Joni Logger-Thread ist eine innere Klasse –