go 素数遍历

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

猜你喜欢

转载自blog.csdn.net/licanfeng1/article/details/132487595