Эквивалент канала Голанг на Яве

У меня есть требование, где мне нужно читать из набора очередей блокировки. Очереди блокировки создаются библиотекой, которую я использую. Мой код должен читать из очередей. Я не хочу создавать поток чтения для каждой из этих очередей блокировки. Скорее, я хочу опрашивать их на предмет наличия данных, используя один поток (или, возможно, максимум 2/3 потока). Поскольку некоторые из блокирующих очередей могут не иметь данных в течение длительного времени, в то время как некоторые из них могут получать пакеты данных. Опрос очередей с небольшим таймаутом будет работать, но это совсем не эффективно, так как он все еще должен продолжать цикл по всем очередям, даже если некоторые из них долгое время не имеют данных. По сути, я ищу механизм select / epoll (используемый в сокетах) для блокировки очередей. Любая подсказка действительно ценится.

Сделать это в Go очень просто. Ниже код имитирует то же самое с каналами и программами:

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

Ответы на вопрос(3)

Ваш ответ на вопрос