多线程-两个线程交替打印数字

使用 channel 实现

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
30
31
32
33
34
35
36
37
38
39
package main

import (
	"fmt"
	"sync"
)

func threadA(chA, chB chan bool, wg *sync.WaitGroup) {
	defer wg.Done()
	for i := 1; i <= 10; i++ {
		<-chA // 等待信号,开始打印
		fmt.Println("threadA:", i)
		chB <- true // 打印完成后,通知 threadB 开始打印
	}
}

func threadB(chA, chB chan bool, wg *sync.WaitGroup) {
	defer wg.Done()
	for i := 11; i <= 20; i++ {
		<-chB // 等待信号,开始打印
		fmt.Println("threadB:", i)
		chA <- true // 打印完成后,通知 threadA 开始打印
	}
}

func main() {
	var wg sync.WaitGroup

	chA := make(chan bool, 1)
	chB := make(chan bool, 1)

	chA <- true

	wg.Add(2)
	go threadA(chA, chB, &wg)
	go threadB(chA, chB, &wg)

	wg.Wait()
}

threadA: 1

threadB: 11

threadA: 2

threadB: 12

threadA: 3

threadB: 13

threadA: 4

threadB: 14

threadA: 5

threadB: 15

threadA: 6

threadB: 16

threadA: 7

threadB: 17

threadA: 8

threadB: 18

threadA: 9

threadB: 19

threadA: 10

threadB: 20

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
30
31
32
33
34
35
36
37
38
39
40
41
42
package main

import (
	"fmt"
	"sync"
)

// 用于打印偶数
func printEven(chA, chB chan bool, wg *sync.WaitGroup) {
	defer wg.Done()
	for i := 2; i <= 10; i += 2 {
		<-chA          // 等待信号
		fmt.Println(i) // 打印偶数
		chB <- true    // 通知线程B继续执行
	}
}

// 用于打印奇数
func printOdd(chA, chB chan bool, wg *sync.WaitGroup) {
	defer wg.Done()
	for i := 1; i <= 9; i += 2 {
		<-chB          // 等待信号
		fmt.Println(i) // 打印奇数
		chA <- true    // 通知线程A继续执行
	}
}

func main() {
	var wg sync.WaitGroup

	chA := make(chan bool, 1)
	chB := make(chan bool, 1)

	chA <- true

	// 启动两个 goroutine,分别打印奇数和偶数
	wg.Add(2)
	go printEven(chA, chB, &wg)
	go printOdd(chA, chB, &wg)

	wg.Wait()
}

2

1

4

3

6

5

8

7

10

9

本文作者:
本文链接: https://hgnulb.github.io/blog/2025/58202529
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处!