一道多线程面试题分析(控制输出顺序)

这是一道15年的面试题,我在博客园看到,作者用C实现了其功能,我最近不是在学go呢么,所以就用go实现了,程序实现比作者的C简单太多了,一目了然。(如果要看C的实现,可以点击链接http://blog.csdn.net/chencheng126/article/details/44488603 查看)

里边唯一一条评论是我填上去的,所以不要怪异为毛一模一样,O(∩_∩)O哈哈~

一道多线程面试题分析(控制输出顺序)_第1张图片
Paste_Image.png

过完年了,俺终于从鸡鸭鱼肉的时间回来了。开始做面试题,准备实战了。

刚看到题目的时候,基本没什么考虑就有了下面的程序,思路:
1.有三个函数,分别负责打印A,B,C
2.利用Goroutine的特点,分别调用这三个函数,并将打印的值输出

package main

import (
    "fmt"
    "time"
)

func printA(c chan string) {
    c <- "A"
}

func printB(c chan string) {
    c <- "B"
}
func printC(c chan string) {
    c <- "C"
}

func main() {
    c := make(chan string, 3)
    go printA(c)
    go printB(c)
    go printC(c)

    cA := <-c
    cB := <-c
    cC := <-c
    var i int
    for i = 0; i < 10; i++ {
        fmt.Print(cA)
        time.Sleep(1 * time.Second)
        fmt.Print(cB)
        time.Sleep(1 * time.Second)
        fmt.Print(cC)
        time.Sleep(1 * time.Second)
    }
}
执行结果:
ABCABCABCABCABCABCABCABCABCABC

睡了一夜,觉得这三个函数的功能其实就是打印,既然功能相同,为什么要三个函数来执行了,所以就改成了下面这段

package main

import (
    "fmt"
    "time"
)

func threadprint(details string, c chan string) {
    c <- details
}

func main() {
    c := make(chan string, 3)
    go threadprint("A", c)
    go threadprint("B", c)
    go threadprint("C", c)

    cA := <-c
    cB := <-c
    cC := <-c
    var i int
    for i = 0; i < 10; i++ {
        fmt.Print(cA)
        time.Sleep(1 * time.Second)
        fmt.Print(cB)
        time.Sleep(1 * time.Second)
        fmt.Print(cC)
        time.Sleep(1 * time.Second)
    }
}

删除了其他两个功能一样的函数,还是用Goroutine的思路。

你可能感兴趣的:(一道多线程面试题分析(控制输出顺序))