如果对go 的chan 不了解 ,请先看菜鸟教程
chan 通道的队列特性chan 通道的广播特性定义通道 : var 通道A chan int
插入通道 : 通道A<- 输入值
先进先出 : 取出值 <-通道A
利用chan 的关闭功能实现 广播
func t1(线程名 string) {
//通道关闭的影响
for {
取出值, 开通 := <-ch
if !开通 {
fmt.Println("通道已关闭")
break
}
fmt.Println( 线程名 , 取出值)
core.Sleeps(2)
}
}
....
ch = make(chan int, 8)
go t1("线程1")
go t1("线程2")
go t1("线程3")
close(ch)
chan 通道的阻塞与非阻塞特性close() 函数可以触发所有的多线程响应关闭事件
利用 通道的读特性( <- )实现阻塞
g:= <-通道变量
...后续代码块
只要通道中没有值,后续代码就无法执行, 这样就实现了阻塞
利用 通道的选择特性( select )实现非阻塞
select {
case <-通道1
....代码块1
default
....代码块2
}
...代码块3
虽然这里用到了通道的读特性,但因为外层包裹了 select{}
所以 即使 通道1 无法取出 值,
依然可以执行 default 后的代码块2,和后续的代码块3
也就实现了非阻塞
利用通道的写缓存实现非阻塞
var c1 chan int= make(chan int, 10)
....
c1 <9
....代码块1
如果c1 通道没有满 , 代码块1 可以被执行
如果c1 通道满了 ,那么9无法插入 ,代码块1也无法执行