package main import ( "fmt" "math/rand" "runtime" "sync" "time" ) var productCount int type Factory struct { locker *sync.Mutex cond *sync.Cond goods []int } // func (self *Factory) init() { self.locker = &sync.Mutex{} self.cond = sync.NewCond(self.locker) } //生产 func (self *Factory) product() { self.cond.L.Lock() defer self.cond.L.Unlock() productCount++ self.goods = append(self.goods, productCount) self.cond.Signal() fmt.Println("发信号 ==") } //消费 func (self *Factory) consume() { self.cond.L.Lock() defer self.cond.L.Unlock() for { if len(self.goods) == 0 { fmt.Println("睡了 =>") self.cond.Wait() fmt.Println("醒了 <=") } else { break } } fmt.Println(self.goods[0]) self.goods = self.goods[1:] } //消费流水线 func (self *Factory) assemblyLine1() { for { self.consume() time.Sleep(time.Millisecond * time.Duration(rand.Int63n(100))) } } //生产流水线 func (self *Factory) assemblyLine0() { for { self.product() time.Sleep(time.Millisecond * time.Duration(rand.Int63n(200))) } } func main() { runtime.GOMAXPROCS(1) var factory = &Factory{} factory.init() go factory.assemblyLine0() go factory.assemblyLine1() select {} }