在goroutine中等待睡眠的主线程

时间:2019-01-28 11:33:22

标签: go sleep channel

编写此非常基本的代码以了解频道。

  1. 如果goroutine中有等待,为什么主goroutine正在等待它?我了解到主goroutine需要等待一段时间,因为调用goroutine之后,控件会立即传递回去。

  2. 为什么goroutine不能像Java中的主线程和子线程那样设计为可以并行运行?

func main() {
    channel := make(chan int)
    go func() {
        time.Sleep(3*time.Second)
    }()

    for {
        fmt.Println("../");
        <-channel
    }
}

1 个答案:

答案 0 :(得分:3)

我认为您的主线程正在等待来自渠道的消息

func main() {
    channel := make(chan int)
    go func() {
        time.Sleep(3*time.Second)
        channel <- 1 // Sending something to the channel to let the main thread continue
        channel <- 2
    }()

    for {
        fmt.Println("../");
        <-channel // Waiting for something to come from the channel
    }
}

关于您的具体问题:

  

如果goroutine中有等待,为什么主goroutine正在等待   在上面吗?

它不等待,可能正在频道中等待。

  

我读到主goroutine需要等待一段时间,因为   调用goroutine后,控件立即传回给它。

如果您的主程序不在通道上等待(或处于无限循环中的堆栈),则它已经完成并关闭了应用程序。 GoRoutines使用主线程(例如Java守护程序线程)关闭

  

为什么goroutines不像主线程和子线程那样设计   它们可以并行运行的Java?

他们实际上是这样做的(: