zoukankan      html  css  js  c++  java
  • go语言从例子开始之Example29.关闭通道

    关闭 一个通道意味着不能再向这个通道发送值了。这个特性可以用来给这个通道的接收方传达工作已经完成的信息。

    Example:

    package main
    import "fmt"
    
    //在这个例子中,我们将使用一个 jobs 通道来传递 main() 中 Go协程任务执行的结束信息
    //到一个工作 Go 协程中。当我们没有多余的任务给这个工作 Go 协程时
    //我们将 close 这个 jobs 通道。
    func main() {
        jobs := make(chan int, 5)
        done := make(chan bool)
    
        //这是工作 Go 协程。使用 j, more := <- jobs 循环的从jobs 接收数据。
        //在接收的这个特殊的二值形式的值中,如果 jobs 已经关闭了,并且通道中所有的值都已经接收完毕,
        //那么 more 的值将是 false。当我们完成所有的任务时,将使用这个特性通过 done 通道去进行通知。
        go func(){
            for{
                j, more := <-jobs
                if more{
                    fmt.Println("recevied jobs:", j)
                }else{
                    fmt.Println("recevied all jobs")
                    done <- true
                    return
                }
            }
        }()
        
        //这里使用 jobs 发送 3 个任务到工作函数中,然后关闭 jobs。
        for i:=1; i<=3; i++{
            jobs <- i
            fmt.Println("Send job:", i)    
        }
    
        //关闭通道
        close(jobs)
    
        //我们使用前面学到的通道同步方法等待任务结束。
        <- done
    }

    Result:

    $ go run example.go
    Send job: 1
    Send job: 2
    Send job: 3
    recevied jobs: 1
    recevied jobs: 2
    recevied jobs: 3
    recevied all jobs

    坐标: 上一个例子     下一个例子

  • 相关阅读:
    Java 代理模式
    ReentrantLock 详解
    Java线程池详解
    ConcurrentHashMap 解读
    CountDownLatch/CyclicBarrie用法记录
    微信接入笔记记录
    iOS设计模式
    iOS设计模式
    iOS设计模式
    iOS设计模式
  • 原文地址:https://www.cnblogs.com/yhleng/p/11756832.html
Copyright © 2011-2022 走看看