Una coda bloccante (di Joonas Pulakka) è la risposta pesante. Una risposta più semplice potrebbe funzionare. Se si dispone di tutti i dati memorizzati nella sorgente, è sufficiente passare un riferimento al processore e può semplicemente prelevare i dati dall'origine. Certo, questo è probabilmente quello che stavi facendo in passato. Potresti non avere tutti i dati in memoria nella sorgente e potresti non ottenere l'accoppiamento basso che desideri.
Il passo successivo sarebbe utilizzare un'interfaccia Enumerator o Iterator. (Gli iteratori sono più comuni in Java, anche se la maggior parte delle volte che il metodo remove
è solo un nusance.) Il processore otterrebbe l'Iterator dall'origine, quindi chiama i metodi fino al termine. Se la fonte sta estraendo da terra terrabyte di dati, ogni chiamata potrebbe richiedere un po 'di tempo. Ma se stai andando a dormire il processore fino a quando c'è qualcosa in coda comunque, lo farà automaticamente. E se la fonte supera il produttore, la sorgente attenderà automaticamente che il produttore chiami hasNext
e next
.
Se, d'altra parte, vuoi che la fonte raccolga i dati dalla sorgente il più velocemente possibile e lo stia accumulando fino a quando il processore non raggiunge, non seduto intorno in attesa che il processore venga elaborato, quindi la coda - e più thread - iniziano a sembrare un'idea buona, anche se più complicata. Ora la sorgente può accumulare i dati quando può correre più velocemente (il suo limite presumibilmente è qualcosa come I / O su disco), e il processore può ridurre le dimensioni della pila quando it può girare più velocemente, ( il suo limite è la velocità con cui il modulo di persistenza può mantenere i dati).