Equivalente del canal de golang en Java
Tengo un requisito donde necesito leer de un conjunto de colas de bloqueo. Las colas de bloqueo son creadas por la Biblioteca que estoy usando. Mi código tiene que leer de las colas. No quiero crear un hilo lector para cada una de estas colas de bloqueo. Más bien, quiero sondearlos para determinar la disponibilidad de datos usando un solo hilo (o probablemente usando 2/3 hilos como máximo). Como algunas de las colas de bloqueo pueden no tener datos durante mucho tiempo, mientras que algunas de ellas pueden obtener ráfagas de datos. El sondeo de las colas con poco tiempo de espera funcionará, pero eso no es eficiente en absoluto, ya que aún necesita seguir recorriendo todas las colas incluso cuando algunas de ellas no tienen datos durante mucho tiempo. Básicamente, estoy buscando un tipo de mecanismo select / epoll (utilizado en sockets) para bloquear colas. Cualquier pista es realmente apreciada.
Sin embargo, hacer eso en Go es realmente fácil. El siguiente código simula lo mismo con canales y goroutines:
package main
import "fmt"
import "time"
import "math/rand"
func sendMessage(sc chan string) {
var i int
for {
i = rand.Intn(10)
for ; i >= 0 ; i-- {
sc <- fmt.Sprintf("Order number %d",rand.Intn(100))
}
i = 1000 + rand.Intn(32000);
time.Sleep(time.Duration(i) * time.Millisecond)
}
}
func sendNum(c chan int) {
var i int
for {
i = rand.Intn(16);
for ; i >= 0; i-- {
time.Sleep(20 * time.Millisecond)
c <- rand.Intn(65534)
}
i = 1000 + rand.Intn(24000);
time.Sleep(time.Duration(i) * time.Millisecond)
}
}
func main() {
msgchan := make(chan string, 32)
numchan := make(chan int, 32)
i := 0
for ; i < 8 ; i++ {
go sendNum(numchan)
go sendMessage(msgchan)
}
for {
select {
case msg := <- msgchan:
fmt.Printf("Worked on %s\n", msg)
case x := <- numchan:
fmt.Printf("I got %d \n", x)
}
}
}