Жди на главной ветке со сном в горутине - PullRequest
0 голосов
/ 28 января 2019

Написал этот очень простой код для понимания каналов.

  1. Если в goroutine есть ожидание, почему основная goroutine ожидает его?Я прочитал, что основная программа должна иметь время ожидания, так как элемент управления возвращается к ней сразу после ее вызова.

  2. Почему программы не разработаны как основной поток и дочерние потоки в Javaгде они могут работать параллельно?

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

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

1 Ответ

0 голосов
/ 28 января 2019

Я думаю, что ваш главный поток ожидает, что что-то придет с канала

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.

Если ваш основной канал не ожидал на канале (или стек в бесконечном цикле), он завершил работу и закрыл приложение.,GoRoutines закрывается с основным потоком (как потоки Java-демона)

Почему в Java не предусмотрены такие программы, как основной поток и дочерние потоки, где они могут работать параллельно?

Они действительно делают (:

...