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("线程退出")
}