Go channel vs Java BlockingQueue

Go channel vs Java BlockingQueue,java,concurrency,go,channel,Java,Concurrency,Go,Channel,Go channel和Java BlockingQueue之间有什么区别吗?两者都是具有相似的阻塞和内存模型语义的队列。也可以选择两者都有一个容量集。它们可以以类似的方式使用 在放置/发送或接收/接收时,两者都会阻塞 两者都有一个容量来控制何时发送将被阻止 最大的区别可能是go通道比java对象便宜得多。go频道可以被限制为仅发送或仅接收,这可以确保关于谁可以从频道发送和谁可以从频道接收的额外类型强制。我想说的最大区别是go频道支持select语句,允许您只执行一个频道操作。一个示例(由以下

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

它们可以以类似的方式使用

  • 在放置/发送或接收/接收时,两者都会阻塞
  • 两者都有一个容量来控制何时发送将被阻止

最大的区别可能是go通道比java对象便宜得多。go频道可以被限制为仅发送或仅接收,这可以确保关于谁可以从频道发送和谁可以从频道接收的额外类型强制。

我想说的最大区别是go频道支持
select
语句,允许您只执行一个频道操作。一个示例(由以下内容更改):

选择{

case i1=要在java中执行类似于golang'select语句的操作,需要使用java.nio包。特别是选择器和通道。请在此处查看包文档:


它提供了与golang select语句几乎相同的功能,使用一个线程从多个通道多路读取/写入。

另一个非常重要的区别是:您可以关闭Go通道以表示没有更多的元素出现。这在Java中是不可能的

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


在java中这样做是不容易的;但是存在一些解决办法。

我认为你可以在阻塞队列上使用投票方法。但是,你正确的选择语句为多个不同通道上的多路复用提供了语法支持。对,我没有提到忙等待,因为我认为非解决方案:。你有没有资料可以证明它们便宜得多?我不是不相信你,但如果Java的一些队列和nio通道在执行时间方面能够跟上,我也不会感到惊讶。我相信Java在内存方面会有所松动。@AdamGent我恐怕手头上没有任何资料。我主要谈论的是内存ot执行速度。Go通道允许任意数据结构(包括指针)要传输,但是java.nio.channels只允许传输字节。我认为它们不具有真正的可比性。的确!这是一个非常重要的区别。对于java,您需要发送某种毒药记录或流结束字符来表示没有更多的项。这需要两侧都有额外的代码,请参阅:
a常见的策略是生产者插入特殊的流末或有毒对象,当消费者使用这些对象时,会相应地进行解释。
有人知道为什么BQ不在附近实现吗?它看起来很简单,但很有用,很重要
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")
    }
}