欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 教育 > 培训 > go协程奇偶打印和交替打印ABC

go协程奇偶打印和交替打印ABC

2024/10/24 22:20:51 来源:https://blog.csdn.net/weixin_43850253/article/details/140887840  浏览:    关键词:go协程奇偶打印和交替打印ABC

前言

这个题目算是面试常问了,之前用JAVA多线程也经常问到(后面有空整理一下)。

奇偶打印

代码直接参考 https://blog.csdn.net/nxj_climb/article/details/133035078, 可能有些小更改 但大差不差。
就是使用channel对协程读和写进行阻塞来保证时序。
(note: 也可以参照上述博客的地址,另一位博主也show了一下单个channel打印奇偶的写法,不过为了普适性,方便应对面试扩展题,还是掌握一下通用一些的写法吧。

package mainimport ("fmt""sync"
)func printNumber(n int) {c1 := make(chan bool, 1)c2 := make(chan bool, 1)wg := sync.WaitGroup{}wg.Add(2)go func(n int) {defer wg.Done()for i := 1; i <= n; i += 2 {<-c1fmt.Println(fmt.Sprintf("A %d", i))c2 <- true}}(n)go func(n int) {defer wg.Done()for i := 2; i <= n; i += 2 {<-c2fmt.Println(fmt.Sprintf("B %d", i))c1 <- true}}(n)// 启动第一个goroutine,因为从1开始,所以先启动打印奇数的协程c1 <- truewg.Wait()
}func main() {printNumber(10)
}

PrintABC

模仿刚刚的策略,书写printABC的策略。使用三个通道进行阻塞读写

package mainimport ("fmt""sync"
)// 交替打印n次ABC
func PrintABC(n int) {c1 := make(chan bool, 1) // 记得一定是一个,不然没法阻塞写c2 := make(chan bool, 1)c3 := make(chan bool, 1)wg := sync.WaitGroup{}wg.Add(3) // 3个协程go func(n int) {defer wg.Done()for i := 1; i <= n; i++ {<-c1fmt.Print(fmt.Sprintf("%d A", i)) // 为了不去数多少个,加个数字吧// fmt.Print("A")c2 <- true}}(n)go func(n int) {defer wg.Done()for i := 1; i <= n; i++ {<-c2fmt.Print("B")c3 <- true}}(n)go func(n int) {defer wg.Done()for i := 1; i <= n; i++ {<-c3fmt.Println("C")c1 <- true}}(n)c1 <- truewg.Wait()
}func main() {PrintABC(10)
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com