问题
通过N个线程顺序循环打印从0至100,如给定N=3则输出:
thread0: 0
thread1: 1
thread2: 2
thread0: 3
thread1: 4
…
思路:递归实现
创建N个通道,在主协程中向通道i中发送当前需要输出的值count,开启一个协程,在该协程中完成输出后再起一个协程,并向第 i+1个通道中发送count+1,后面的过程就是递归。这种方法通过一个协程执行完成再来生成第二个协程的方式, 轮询通道的切片来完成协程之间的同步任务
package main
import (
"fmt"
"io"
"strconv"
)
var (
num int // 要输出的最大值
n int // 要启动的线程数
line = 0 // 通道发送计数器
exit = make(chan bool)
chans []chan int // 要初始化的协程数量
)
func main() {
fmt.Println("输入线程个数:")
_,ok := fmt.Scanf("%d\n",&n)
if ok == io.EOF{
return
}
// 创建n个通道
chans = make([]chan int, n)
for i := 0; i < n; i++ {
chans[i] = make(chan int)
}
// 多协程启动入口
go ChanWork(chans[0])
// 接收要输出的最大数
fmt.Println("输入要输出的最大数值:")
_, ok = fmt.Scanf("%d\n", &num)
if ok == io.EOF {
return
}
// 触发协程同步执行
chans[0] <- 0
// 执行结束
if <-exit {
return
}
}
func ChanWork(c chan int) {
// 协程数
lens := len(chans)
for {
// count为输出计数器
if count := <-chans[line]; count <= num {
fmt.Println("Thread"+strconv.Itoa(line)+": ", count)
count++
// 下一个发送通道
line++
if line >= lens {
line = 0 //循环,防止索引越界
}
go ChanWork(chans[line])
chans[line] <- count
} else {
close(exit)
return
}
}
}