【四二学堂】golang系列之|二、go协程案例--用协程判断素数

go协程案例--统计1-8000的数字中,那些是素数

四个协程,使用管道channel

package main

import (
	"fmt"
	"time"
)

//向intChan放入1-8000个数
func putNum(intChan chan int){
	for i:=1;i<=8000 ;i++  {
		intChan <- i
	}

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

//从intChan中取出数据,判断是否是素数,如果是,放入primeChan
func primeNum(intChan chan int,primeChan chan int,exitChan chan bool){

	var flag bool

	for{
		time.Sleep(time.Millisecond*10)
		num,ok := <- intChan
		if !ok {	//intChan取不到
			break
		}

		flag = true
		//判断num是不是素数
		for i:=2;i<num ;i++  {
			if num % i == 0 {	//不是素数
				flag = false
				break
			}
		}

		if flag {
			//是素数,就把这个数放到primeChan里
			primeChan <- num
		}

		fmt.Println("有一个intChan 取不到数据,退出")
	}


	//做退出标记
	exitChan <- true
}


func main() {
	intChan := make(chan int,1000)
	primeChan := make(chan int,2000)

	//标识退出的管道
	exitChan := make(chan bool,4)

	//开启一个协程,把1-8000放入 intChan
	go putNum(intChan)

	//开启4个协程,从intChan取数据,判断是不是素数,如果是,放入primeChan
	for i:=0;i<4 ;i++  {
		go primeNum(intChan,primeChan,exitChan)
	}

	//主线程处理
	go func() {
		for i:=0;i<4 ;i++  {
			<- exitChan
		}
		//当取到四个协程的返回结束标记,就可以关闭primeChan
		close(primeChan)
	}()

	//遍历primeChan 取出数据
	for {
		res,ok := <- primeChan
		if !ok {
			break
		}
		//输出结果
		fmt.Println("素数=%d\n",res)
	}

	fmt.Print("线程退出")
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值