java - Go channel vs Java BlockingQueue

标签 java concurrency go channel

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

最佳答案

我想说最大的区别是 Go channel 支持 select 语句,它允许您只执行一个 channel 操作。一个示例(由 Go language specification 更改):

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 接收操作中的一个。进入选择时,会随机选择一个就绪 channel (如果有)。否则,操作会阻塞,直到其中一个 channel 准备好。

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

关于java - Go channel vs Java BlockingQueue,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10690403/

相关文章:

java - 停止 Apache CXF 记录 MultipartBody 附件的二进制数据

java - 我在获取外部对象时遇到 LazyInitializationException

c# - 如果从未读取值,让多个线程写入同一个 bool 是否安全?

firebase - 如何增加Firebase数据库读取时间并防止Nginx超时

go - 拆分包括 EOF?

java - Java拖拽时如何获取鼠标信息?

java - 使用if语句来防止 "java.lang.IndexOutOfBoundsException"

java - 是否有必要对可能被单线程调度程序修改的字段使用 Java 同步?

java - 程序顺序规则在构造函数中起作用之前是否发生?

go - slice 索引超出范围但有一个空间可用