前段时间有个题目,是要求Java多线程完成ABAC重复输出,要求是A线程值输出A,B线程只输出B,C线程只输出C,
可我不太会Java,就改用Go实现尝试一下,
当晚结束后改了1个多小时终于写完,也是对知识的补充理解了。
package main
import (
"fmt"
"sync"
)
var wg sync.WaitGroup
var n int
var chA = make(chan int)
var chB = make(chan int)
var chC = make(chan int)
func main() {
fmt.Scan(&n)
wg.Add(1)//增加进程任务
go send(n)
wg.Wait()//用于等待该进程结束,直至wg.Done()运行次数等于wg.Add()增加的次数,同时避免time.Sleep的尴尬用法
}
func send(n int) {
go A(chA)
go B(chB)
go C(chC)
chA <- 1
}
func A(c chan int) {
for {//for是为了保持运行
if count := <-c; count <= n {
fmt.Print("A")
if (count+1)%4 != 0 {
chB <- count + 1
} else {
chC <- count + 1
}
} else {
wg.Done()
return
}
}
}
func B(c chan int) {
for {
if count := <-c; count <= n {
fmt.Print("B")
chA <- count + 1
} else {
wg.Done()
return
}
}
}
func C(c chan int) {
for {
if count := <-c; count <= n {
fmt.Print("C")
chA <- count + 1
} else {
wg.Done()
return
}
}
}