简单的用go协程统计8000内的素数

package main

import (
    "time"
    "fmt"
)

//向管道放入80000个数
func createData(size int, intDataChan chan int)  {
    if size < 1 {
        return
    }

    for i := 1; i <= size; i++ {
        intDataChan <- i
    }

    close(intDataChan)
}

func getSuShu(intDataChan chan int, primeChan chan int, exitChan chan bool)  {

    var flag bool
    for {
        time.Sleep(time.Millisecond * 10)
        num, ok := <- intDataChan
        if !ok {//取不到数据
            break
        }
        flag = true //假设是素数
        for i := 2; i <= num /2; i++{
            if num % i == 0 {
                flag = false //确定不是素数
                break
            }
        }

        if flag {
            primeChan <- num
        }
    }

    fmt.Println("\n 有一个协程取不到数据,退出")

    exitChan <- true //标记退出
}

func main() {
    var maxInt  = 8000
    intDataChan := make(chan int, 1000)
    primeChan := make(chan int, maxInt / 3)
    exitChan := make(chan bool, 4)

    go createData(maxInt, intDataChan)

    for i := 0; i < 4; i++ {
        go getSuShu(intDataChan, primeChan, exitChan)
    }

    go func() {
        for i := 0; i < 4; i++ {
            <- exitChan //阻塞直到四个协程都完成工作
        }

        close(primeChan)//关闭管道
    }()

    for {
        res, ok := <- primeChan
        if !ok {
            break
        }

        fmt.Print(res, "  ")
    }
}

转载于:https://www.cnblogs.com/hirampeng/p/11184288.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值