Go多协程交替输出内容

问题

go语言实现两个goroutine交替执行打印数字和字母,效果:12AB34CD56EF…

解决方案

https://blog.csdn.net/swan_tang/article/details/103514633

这篇文章提供了两种方法,一种是使用无缓冲的channel方法,另一种为有缓冲的channel+waitgroup的方法

写一个简单的示例:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package main

import (
	"fmt"
	"sync"
)

func main() {
	ch1, ch2 := make(chan bool, 1), make(chan bool, 1)	//生成两个缓冲为1的chan bool
	wg := sync.WaitGroup{}	//生成一个WaitGroup用于主线程等待
	wg.Add(2)	
	go func() {
		defer wg.Done()
		for i := 0; i < 100; i++ {
			<-ch1	//从第一个channel接收信号,无信号则阻塞
			fmt.Println("1")
			ch2 <- true	//输出后向第二个channel发送信号,用于告知线程2继续运行
		}
	}()
	go func() {
		defer wg.Done()
		for i := 0; i < 100; i++ {
			<-ch2	//从第二个channel接收信号,无信号则阻塞
			fmt.Println("2")
			ch1 <- true	//输出后向第一个channel发送信号,用于告知线程1继续运行
        }()
	ch1 <- true	//向线程1发送信号,如果不发送则都阻塞,产生死锁问题
	wg.Wait()	//等待线程组工作完毕
}

结果为:1、2循环输出

Licensed under CC BY-NC-SA 4.0