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)
        }
    }
}

Respuestas a la pregunta(3)

Su respuesta a la pregunta