java - Go 的并发 Java 示例

标签 java concurrency go

我有以下来自 GoByExamples 的并发 channel 示例

Java 中是否有等效的东西?我原以为实现同样的事情会更加冗长。

// Basic sends and receives on channels are blocking.
// However, we can use `select` with a `default` clause to
// implement _non-blocking_ sends, receives, and even
// non-blocking multi-way `select`s.

package main

import "fmt"

func main() {
    messages := make(chan string)
    signals := make(chan bool)

    // Here's a non-blocking receive. If a value is
    // available on `messages` then `select` will take
    // the `<-messages` `case` with that value. If not
    // it will immediately take the `default` case.
    select {
    case msg := <-messages:
        fmt.Println("received message", msg)
    default:
        fmt.Println("no message received")
    }

    // A non-blocking send works similarly.
    msg := "hi"
    select {
    case messages <- msg:
        fmt.Println("sent message", msg)
    default:
        fmt.Println("no message sent")
    }

    // We can use multiple `case`s above the `default`
    // clause to implement a multi-way non-blocking
    // select. Here we attempt non-blocking receives
    // on both `messages` and `signals`.
    select {
    case msg := <-messages:
        fmt.Println("received message", msg)
    case sig := <-signals:
        fmt.Println("received signal", sig)
    default:
        fmt.Println("no activity")
    }
}

最佳答案

Select 语句 是在 Go 语言语法级别引入并发的原因。并发函数调用可以(并且通常完成)在库级别使用辅助函数如 spawn(function()) 和 channel 实现,就像大多数其他语言中具有互斥锁或锁的数据结构一样。但是 select 语句不能。

关于java - Go 的并发 Java 示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28060277/

相关文章:

java - Hibernate EJB 架构 - 模型 ClassNotFoundException

java - 如何防止android应用程序因后台线程异常而崩溃?

java - IBM 工作灯 6.1 - "Ecma Error: TypeError: Cannot call property <function> in object"

java - 什么是最好/最优雅的方式来限制并行流中并发评估的数量(比如使用固定线程池)

java - ExecutorService 中的 Activity 线程

go - 通过值获取世界状态

java - 术语 : "Entity Bean" vs. "Data Model"

java - 为什么程序等待schedule()完成但不等待scheduleWithFixedDelay()?

转到错误拨号 tcp : Protocol not available

go - 如何取两个大 float