通过channel实现go协程间的协作,类似于java的wait和notify。协程1执行到i 等于10因为管道没数据被阻塞,协程2执行完写入数据到channel,协程1被唤醒继续执行。
一、代码
package main
import "fmt"
import "time"
func main() {
ch := make(chan int)
go func() {
for i := 0; i < 20; i++ {
if i == 10 {
<-ch //读取ch的数据 会阻塞 相当于java的wait
}
fmt.Printf("task1 %d\n", i)
}
}()
go func() {
for i := 0; i < 20; i++ {
fmt.Printf("task2 %d\n", i)
}
ch <- 1 //写入数据 唤醒协程1 相当于java的notify
}()
time.Sleep(time.Second)
}
二、运行结果
task2 0
task2 1
task2 2
task2 3
task2 4
task2 5
task2 6
task2 7
task2 8
task2 9
task2 10
task2 11
task2 12
task2 13
task2 14
task2 15
task2 16
task2 17
task2 18
task2 19
task1 0
task1 1
task1 2
task1 3
task1 4
task1 5
task1 6
task1 7
task1 8
task1 9
task1 10
task1 11
task1 12
task1 13
task1 14
task1 15
task1 16
task1 17
task1 18
task1 19