为了账号安全,请及时绑定邮箱和手机立即绑定

转到频道与Java BlockingQueue

转到频道与Java BlockingQueue

Go
MMMHUHU 2021-04-28 12:16:45
Go通道和Java BlockingQueue之间有什么区别吗?两者都是具有相似阻塞和内存模型语义的队列。可选地,两个都可以设置容量。
查看完整描述

3 回答

?
一只甜甜圈

TA贡献1836条经验 获得超5个赞

我要说的最大区别是Go通道支持该select语句,该语句使您可以执行精确的一个通道操作。一个示例(从Go语言规范中更改):


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语句的属性,而不是通道的设计,但是我会认为这是通道设计的基础。


查看完整回答
反对 回复 2021-05-10
?
慕莱坞森

TA贡献1810条经验 获得超4个赞

一个非常重要的区别是:您可以关闭Go通道,以表示不再有其他元素。使用Java是不可能的。

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

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


查看完整回答
反对 回复 2021-05-10
  • 3 回答
  • 0 关注
  • 198 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信