1. 多个groutine交替打印数字和字母
package main
import (
"fmt"
"sync"
)
var numChan, strChan = make(chan struct{}), make(chan struct{})
var wg1 sync.WaitGroup
func printNum() {
defer wg1.Done()
for i := 1; i <= 26; i += 2 {
<-numChan
fmt.Printf("%v%v", i, i+1)
strChan <- struct{}{}
}
<-numChan
}
func printStr() {
defer wg1.Done()
for i := 65; i <= 90; i += 2 {
<-strChan
fmt.Printf("%v%v", string(rune(i)), string(rune(i+1)))
numChan <- struct{}{}
}
}
func main() {
wg1.Add(2)
go printNum()
go printStr()
numChan <- struct{}{}
wg1.Wait()
}
2. 多个groutine交替打印奇数和偶数
package main
import (
"fmt"
"sync"
)
var ch1, ch2 = make(chan struct{}), make(chan struct{})
var wg sync.WaitGroup
func odd() {
defer wg.Done()
for i := 1; i < 100; i += 2 {
<-ch1
fmt.Println("goroutine1:",i)
ch2 <- struct{}{}
}
<-ch1
}
func even() {
defer wg.Done()
for i := 2; i <= 100; i += 2 {
<-ch2
fmt.Println("goroutine2:",i)
ch1 <- struct{}{}
}
}
func main() {
wg.Add(2)
go odd()
go even()
ch1 <- struct{}{}
wg.Wait()
}
3. N个groutine交替打印
- 启动N个协程,共用一个外部变量计数器,计数器范围是1到100
- 开启N个有缓冲chan,chans[i]塞入数据代表协程i可以进行打印了
- 协程i一直阻塞,直到chan[i]通道有数据可以拉,才打印
package main
import "fmt"
func main() {
goroutineNum := 5
var chanSlice []chan int
exitChan := make(chan int)
for i := 0; i < goroutineNum; i++ {
chanSlice = append(chanSlice, make(chan int, 1))
}
num := 1
j := 0
for i := 0; i < goroutineNum; i ++ {
go func(i int) {
for {
<-chanSlice[i]
if num > 100 {
exitChan <- 1
break
}
fmt.Println(fmt.Sprintf("gorutine%v:%v", i, num))
num++
if j == goroutineNum-1 {
j = 0
}else {
j ++
}
chanSlice[j] <- 1
}
}(i)
}
chanSlice[0] <- 1
select {
case <-exitChan:
fmt.Println("end")
}
}