Eu tenho um produtor que lê blocos de texto a partir do disco. Vários consumidores estão fazendo cálculos sobre que blocos.
Gostaria produtor para pausar a leitura de dados a partir do disco se houver mais que n bloqueia a ser calculado sobre.
Tê-la colocado em pseudocódigo para ilustrar o que eu gostaria de alcançar.
// "produceBlocks" reads blocks from disk one by one
// and feeds them to lambda
produceBlocks(block -> {
// (!) if activeCounter exceeds a THRESHOLD, then pause
executorService.submit(() -> {
activeCounter.incrementAndGet();
// do some work
activeCounter.decrementAndGet();
});
});
"Eu gostaria produtor para pausar a leitura de dados a partir do disco se houver mais que n blocos actualmente a ser calculado sobre." O descrition tarefa real é um pouco diferente: o produtor, antes de ler dados do disco, deve adquirir uma autorização para fazê-lo . Se o seu produtor é um fio, instalação, em seguida, natural para gerenciar licenças é Semaphore . Initialy que contém n permita. O produtor, para ler um bloco, aguires 1 permit com Semaphore::aquire
. Quando o bloco é processado pelo consumidor, consumidor liberta 1 licença com Semaphore::release
.
Outra abordagem é combinar blocos e licenças. De forma similar à fila de saída do produtor até ao consumidor, criar uma entrada de bloqueio fila de blocos. Initualy colocar lá n blocos. O produtor, para ler um bloco, em primeiro lugar leva o próximo quarteirão essa fila. Consumidor, depois de manusear um bloco, retorna para a fila de entrada.