有四个线程1、2、3、4。线程1的功能就是输出1,线程2的功能就是输出2,以此类推.........现在有四个文件ABCD。初始都为空。现要让四个文件呈如下格式:
A:1 2 3 4 1 2.... B:2 3 4 1 2 3.... C:3 4 1 2 3 4.... D:4 1 2 3 4 1....
看图,可以发现从A开始循环数“1,2,3,4”,遇到4则在当前文件重新开始输出,然后顺序输出。 play@google
有四个线程1、2、3、4。线程1的功能就是输出1,线程2的功能就是输出2,以此类推.........现在有四个文件ABCD。初始都为空。现要让四个文件呈如下格式:
A:1 2 3 4 1 2.... B:2 3 4 1 2 3.... C:3 4 1 2 3 4.... D:4 1 2 3 4 1....
看图,可以发现从A开始循环数“1,2,3,4”,遇到4则在当前文件重新开始输出,然后顺序输出。 play@google
package main | |
import ( | |
"bytes" | |
"fmt" | |
"strconv" | |
) | |
const STEP, NUM = 4, 40 | |
var ( | |
chans [STEP]chan int // 创建生产者 | |
files [STEP]*bytes.Buffer // 创建接受者 | |
last, cur = 0, 0 | |
) | |
func main() { | |
for i := range chans { | |
chans[i] = make(chan int) | |
files[i] = new(bytes.Buffer) | |
go func(out chan<- int, prime int) { | |
for { | |
out <- prime | |
} | |
}(chans[i], i) | |
} | |
for j := 0; j < NUM; j++ { | |
k := <-chans[j%STEP] + 1 | |
files[cur].WriteString(strconv.Itoa(k)) | |
// 当前游标如果到达最大值 则停留一次,然后继续前进 | |
if k != STEP || cur == last { | |
last, cur = cur, (cur+1)%4 | |
} | |
} | |
fmt.Print(files) | |
} |