package main
import (
"fmt"
"time"
)
func putNum(intChan chan int) {
for i := 1; i <= 8000; i++ {
intChan <- i
}
close(intChan)
}
func primeNum(intChan chan int, primeChan chan int, exitChan chan bool) {
//使用for
//var num int
var flag bool
for {
time.Sleep(time.Millisecond * 10)
num, ok := <-intChan
if !ok {
//管道取不到数据了
break
}
flag = true //假设是素数
//判断num是不是素数
for i := 2; i < num; i++ {
if num%i == 0 {
//说明不是素数
flag = false
break
}
}
if flag {
//将这个数放到素数管道primeChan
primeChan <- num
}
}
fmt.Println("有一个primeNum协程取不到数据了,退出")
//这里我们还不能关闭管道
//向exitChan管道写入退出
exitChan <- true
}
func main() {
intChan := make(chan int, 1000)
primeChan := make(chan int, 2000) //放入结果
//标识退出管道
exitChan := make(chan bool, 4) //4个
//开启四个协程,像intChan 放入1-8000
go putNum(intChan)
//开启4个协程,像intChan 取出数据,并判断是否为素数
for i := 0; i < 4; i++ {
go primeNum(intChan, primeChan, exitChan)
}
go func() {
//这里我们主线程,进行处理
for i := 0; i < 4; i++ {
<-exitChan
}
//当我们从这个管道取出4个结果,就可以放心关闭管道
close(primeChan)
}()
//遍历我们的primeNum ,把结果取出
for {
res, ok := <-primeChan
if !ok {
break
}
//将结果输出
fmt.Printf("素数是%d\n", res)
}
fmt.Println("线程退出")
}
go 素数遍历
猜你喜欢
转载自blog.csdn.net/licanfeng1/article/details/132487595
今日推荐
周排行