Uma fila de bloqueio (de Joonas Pulakka) é a resposta mais pesada. Uma resposta mais simples pode funcionar. Se você tiver todos os dados armazenados na fonte, basta passar uma referência ao processador, e ele pode simplesmente capturar os dados da fonte. Claro, isso é provavelmente o que você estava fazendo no passado. Você pode não ter todos os dados na memória na fonte e pode não obter o baixo acoplamento desejado.
O próximo passo seria usar uma interface do Enumerator ou Iterator. (Os iteradores são mais comuns em Java, embora na maioria das vezes esse remove
método seja apenas um incômodo.) O processador obteria o iterador da fonte e depois os chamaria até o término. Se a fonte estiver obtendo terrabytes de dados de algum lugar, cada chamada poderá demorar um pouco. Mas se você estiver indo dormir o processador até que haja algo na fila de qualquer maneira, isso será feito automaticamente. E se a fonte ficar à frente do produtor, ela esperará automaticamente que o produtor ligue hasNext
e next
.
Se, por outro lado, você quer a fonte pegar dados a partir de sua fonte tão rápido quanto ele pode e estocando-o até que o processador alcança, não sentado à espera que o processador processo, então a fila - e threads-- múltipla comece a parecer uma boa ideia, se mais complicada. Agora, a fonte pode acumular os dados quando ele pode correr mais rápido (o seu limite sendo presumivelmente algo como disco I / O), e o processador pode reduzir o tamanho da pilha quando ele pode correr mais rápido, (seu limite sendo o quão rápido a persistência módulo pode persistir os dados).