chan与sync.WaitGroup实现java中CountDownLatch功能

可以使用chan与sync.WaitGroup实现java中类似CountDownLatch功能。下面分别使用代码示例来说明。

chan的方式如下:

package main

import (
    "time"
    "fmt"
    "io/ioutil"
)

type Job2 struct {
    i    int
    max  int
    text string
}

func outputText2(j *Job2, syn chan int) {
    fileName := j.text + ".txt"
    fileContents := ""

    for j.i < j.max {
        time.Sleep(1 * time.Millisecond)
        fileContents += j.text
        fmt.Println(j.text)
        j.i++
    }

    err := ioutil.WriteFile(fileName, []byte(fileContents), 0644)
    if err != nil {
        panic("something went awry")
    }

    syn <- 1
}

func main() {

    hello := new(Job2)
    hello.text = "hello"
    hello.i = 0
    hello.max = 3

    world := new(Job2)
    world.text = "world"
    world.i = 0
    world.max = 5

    var syn = make(chan int, 2)
    go outputText2(hello, syn)
    go outputText2(world, syn)

    <-syn
    <-syn
    fmt.Println("completed over")
    //可以有2种同步方式,sync.WaitGroup/chan
}

sync.WaitGroup的实现方式如下:

package main

import (
    "time"
    "fmt"
    "io/ioutil"
    "sync"
)

type Job1 struct {
    i    int
    max  int
    text string
}

func outputText1(j *Job1, wg *sync.WaitGroup) {

    defer (*wg).Done()

    fileName := j.text + "1.txt"
    fileContents := ""

    for j.i < j.max {
        time.Sleep(1 * time.Millisecond)
        fileContents += j.text
        fmt.Println(j.text)
        j.i++
    }

    err := ioutil.WriteFile(fileName, []byte(fileContents), 0644)
    if err != nil {
        panic("something went awry")
    }
}

func main() {

    //var wg sync.WaitGroup
    wg := new(sync.WaitGroup)

    hello := new(Job1)
    hello.text = "hello"
    hello.i = 0
    hello.max = 3

    world := new(Job1)
    world.text = "world"
    world.i = 0
    world.max = 5

    go outputText1(hello, wg)
    go outputText1(world, wg)

    wg.Add(2)
    wg.Wait()
    fmt.Println("completed over")
    //可以有2种同步方式,sync.WaitGroup/chan
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    阳明AI阅读 16,019评论 3 119
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,026评论 19 139
  • 又经历了三天充实的培训,学习了《情绪压力管理与阳光心态塑造》、《不忘初心—做一个有为的银行人》、《精准服...
    曹昪楠阅读 283评论 0 0
  • 早上送爱人朱玉琼坐刘朝伟的车,和李莎莎,刘莉一起去上二阶。真心替她他们开心。接下来的几天里,带我们家两个宝贝的事是...
    31c47a10aded阅读 146评论 1 2