Ich habe einen Worker Thread läuft unendlich, der für eine Minute schlafen geht, wenn es nichts zu tun gibt. Manchmal erzeugt ein anderer Code etwas Arbeit und möchte den Worker-Thread sofort aufwecken.Aufwachen eines Threads, ohne zu riskieren, blockiert zu werden
Also habe ich so etwas wie dieses (Code nur für Abbildung):
class Worker {
public void run() {
while (!shuttingDown()) {
step();
}
}
private synchronized void step() {
if (hasWork()) {
doIt();
} else {
wait(60_000);
}
}
public synchronized wakeMeUpInside() {
notify();
}
}
Was ich nicht mag nur den Monitor zu betreten ist, die für etwas aufzuwecken, was bedeutet, dass der Benachrichtigungs Thread für nicht verzögert werden kann, guter Grund. Da die Auswahl der einheimischen Synchronisation begrenzt sind, dachte ich, ich Condition
wechseln würde, aber es hat exactly the same problem:
Eine Implementierung kann (und in der Regel der Fall ist) erfordern, dass der aktuelle Thread die Sperre im Zusammenhang mit diesem Zustand halten, wenn Diese Methode wird aufgerufen.
Ich denke, ich tue etwas nur dumm ... eigentlich nur 'wait' und' notify' Notwendigkeit im synchronisierten Block eingeschlossen sein. Dort gibt es eine andere unabhängige Synchronisation, die ich zusammenlegte .... – maaartinus
Ich würde stattdessen eine 'BlockingQueue' empfehlen. Auf diese Weise können Sie 'synchronized' und' wait/notify' vergessen. Sie müssen nur den Thread unterbrechen, der auf 'queue.poll()' wartet, wenn Sie herunterfahren. – Kayaman
@Kayaman Ich bin mir über "BlockingQueue" bewusst, aber ich sende keine Arbeit an den Thread, ich melde es nur. Auch alle Arbeiten (die von mehreren Threads ausgeführt werden) können in einem einzigen Schritt ausgeführt werden oder auch nicht. – maaartinus