Si riferisce alla commentare nel JavaDoc:
Inoltre, il comportamento di questa operazione non è definito se la raccolta specificata viene modificata mentre l'operazione è in corso.
Credo che questo si riferisce alla raccolta list
nel tuo esempio:
blockingQueue.drainTo(list);
il che significa che non è possibile modificare list
allo stesso tempo si è scaricata da blockingQueue
in list
. Tuttavia, la coda di blocco si sincronizza internamente in modo che quando viene chiamato il numero drainTo
,
e
(vedere la nota in basso) venga bloccato. Se non lo facesse, non sarebbe veramente sicuro per i thread. È possibile controllare il codice sorgente e verificare che drainTo
sia sicuro per i thread per quanto riguarda la coda di blocco stessa.
In alternativa, si intende che quando si chiama drainTo
che si desidera bloccare fino a quando almeno un oggetto è stato aggiunto alla coda? In questo caso, si ha poca scelta diversa:
list.add(blockingQueue.take());
blockingQueue.drainTo(list);
per bloccare fino a quando sono stati aggiunti uno o più elementi, e poi scolare l'intera coda nella collezione list
.
Nota: A partire da Java 7, per get e put viene utilizzato un blocco separato. Le operazioni di Put ora sono consentite durante uno drainTo (e una serie di altre operazioni di Take).
È improbabile che la raccolta a cui si sta copiando sia protetta da thread. Quale sarebbe il punto? –
È garantito che drainTo (lista) non chiami list.clear()? Non lo vedo nella javadoc ovunque. – Recurse
@Recurse: JavaDoc non * garantisce * che drainTo (lista) non chiami clear(), suppongo, perché non dice che non lo farà. Tuttavia, sarebbe molto sorprendente se facesse qualcosa di così importante per una raccolta passata senza documentare questa azione. Molti considererebbero questo un bug serio. – Eddie