Go channel vs Java BlockingQueue

2022-09-03 04:21:31

Go通道和Java BlockingQueue之间有什么区别吗?两者都是具有相似阻塞和内存模型语义的队列。(可选)两者都可以具有容量集。


答案 1

我想说最大的区别是Go通道支持语句,它允许您只执行一个通道操作。一个例子(从Go语言规范修改而来):select

select {
case i1 = <-c1:
    print("received ", i1, " from c1\n")
case c2 <- i2:
    print("sent ", i2, " to c2\n")
case i3, ok := (<-c3):  // same as: i3, ok := <-c3
    if ok {
        print("received ", i3, " from c3\n")
    } else {
        print("c3 is closed\n")
    }
}

在此示例中,将只执行一个从 c1 接收、发送到 c2 或从 c3 接收操作。进入选择时,将随机选择现成的通道(如果有)。否则,操作将阻塞,直到其中一个通道准备就绪。

我不知道使用Java实用程序对此通道选择进行建模的任何简单方法。有人可能会争辩说,这是语句的属性,而不是通道的设计,但我认为这是通道设计的基础。select


答案 2

另一个非常重要的区别是:您可以关闭Go通道以表示没有更多元素即将到来。使用Java是不可能的。

示例:goroutine A 读取文件列表。它将每个文件发布到频道中。在最后一个文件之后,它关闭通道。goroutine B从通道读取文件并以某种方式处理它们。通道关闭后,goroutine 退出。

在Java中做到这一点并不容易。但是存在一些解决方法。


推荐