有四个线程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....

有四个线程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....

| 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) | |
| } |