美文网首页
一道多线程面试题分析(控制输出顺序)

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

作者: 大雁儿 | 来源:发表于2017-02-07 17:14 被阅读31次

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

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

    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的思路。

    相关文章

      网友评论

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

          本文链接:https://www.haomeiwen.com/subject/yqdmittx.html