Go多协程循环打印ABAC

£可爱£侵袭症+ 提交于 2019-12-01 15:58:27

前段时间有个题目,是要求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
      }
   }
}

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!