在 Go 中使用 go 来执行一个函数即可生成一个线程,比如
1 | package main |
运行结果可能为
1 | 1 |
2
并没有被打印,因为主线程不会去等待子线程执行完才结束,能执行多少就多少,所以 PrintNum(2)
就可能没有被执行。
这种情况我们需要让主线程等待一下子线程,比如一秒钟
1 | package main |
1 | 1 |
这次正常运行结果。
不过实际开发中,子线程的个数和所需要的时间一定是不确定的,我们不可能去指定一个固定时间来等待子线程,比如
1 | for i := 0; i < 10; i++ { |
这时候我们需要使用 select 来进行判断,像这样
1 | t := time.NewTicker(200 * time.Millisecond) |
将 select 嵌套在死循环中,通过管道来判断子线程的任务是否执行完毕,如果 c 管道没有值,那么将一直进行 t.C
的操作
然后在认定子线程完成时,给管道 c 传入值
1 | c := make(chan int, 1) |
完整代码见github
运行结果如下
1 | 0 |
最近热读
扫码关注公众号,或搜索公众号“温欣爸比”
及时获取我的最新文章