/*
用goroutine完成计算1-20000 有多少个素数
*/
package main
import(
"fmt"
"time"
)
var rwChan = make(chan int, 100)
var resultChan = make(chan uint64,200)
var flagChan chan bool
const threadNu = 8
var resultSplice = make([]uint64, 0)
//往信道中放入数据 完成后关闭信道
func WriteNu(nu int) {
for i := 1; i <= nu; i++ {
rwChan<- i
}
close(rwChan)
fmt.Println("1-",nu," 数据放入完毕!")
}
//判断一个数据是否是素数
func JudgeNu() {
for{
val, ok := <-rwChan
if !ok {
break
}
// 能拿到数据 开始判断数据是否为素数
isPrime := true
for i := 2; i < val; i++ {
if val % i == 0 {
isPrime = false
}
}
if isPrime {
resultChan<- uint64(val)
}
}
fmt.Println("有一个判断协程关闭。")
flagChan<- true
}
//保存数据
func SaveResult(){
for {
val,ok := <-resultChan
if !ok {
break
}
resultSplice =append(resultSplice,val)
}
}
func main() {
flagChan = make(chan bool ,threadNu)
go WriteNu(20000)
time.Sleep(time.Millisecond)
for i := 0; i < threadNu; i++ {
go JudgeNu()
}
go SaveResult()
//阻塞主主线程判断 开的G 都执行完成没
for i := 0; i < threadNu; i++ {
<-flagChan
}
//关闭临时保存信道
close(resultChan)
fmt.Println("--------------结果集----------------------")
for _,val := range resultSplice {
fmt.Printf("%v\t",val)
}
}
基础应用的一个示例。