Go多协程循环打印ABAC

前段时间有个题目,是要求Java多线程完成ABAC重复输出,要求是A线程值输出A,B线程只输出B,C线程只输出C,

可我不太会Java,就改用Go实现尝试一下,

当晚结束后改了1个多小时终于写完,也是对知识的补充理解了。

 package main

import (
   "fmt"
   "sync"
)

var wg sync.WaitGroup
var n int
var chA = make(chan int)
var chB = make(chan int)
var chC = make(chan int)

func main() {
   fmt.Scan(&n)
   wg.Add(1)//增加进程任务
   go send(n)
   wg.Wait()//用于等待该进程结束,直至wg.Done()运行次数等于wg.Add()增加的次数,同时避免time.Sleep的尴尬用法
}

func send(n int) {
   go A(chA)
   go B(chB)
   go C(chC)
   chA <- 1
}

func A(c chan int) {
   for {//for是为了保持运行
      if count := <-c; count <= n {
         fmt.Print("A")
         if (count+1)%4 != 0 {
            chB <- count + 1
         } else {
            chC <- count + 1
         }
      } else {
         wg.Done()
         return
      }
   }
}

func B(c chan int) {
   for {
      if count := <-c; count <= n {
         fmt.Print("B")
         chA <- count + 1
      } else {
         wg.Done()
         return
      }
   }
}

func C(c chan int) {
   for {
      if count := <-c; count <= n {
         fmt.Print("C")
         chA <- count + 1
      } else {
         wg.Done()
         return
      }
   }
}

 

posted @ 2019-10-17 13:54  VingB2by  阅读(701)  评论(0编辑  收藏  举报