在前面我们介绍了go语言多线程编程的一些核心知识点。这篇文章再来点实用的内容。
假设有这样一个场景:
主线程需要启动10个子线程,然后这10个子线程执行任务执行完毕之后需要把结果统一返回回来,然后主线程再继续处理结果,试问这种场景怎么办?
经过前面几篇多线程的文章的介绍,其实我们是有思路的,首先通过sync.WaitGroup进行线程等待,然后子结果放在chan通道里面,最后主线程从通道里面获取结果,然后再处理对吧?下面我们来实践一下:
1)创建结果类
这里我们创建一个chan,然后把对象执行的结果包装成结果类,然后把结果类放到chan的切片里面。所以这里创建的类是:
type r struct {
index int
value int
}2)创建chan切片
然后我们创建一个chan的切片,用来存放结果
result := make(chan r, 100)
3)声明一个sync.waitgroup
var wg sync.WaitGroup
4)启动子线程,把线程数添加到sync.waitgroup里面
for i := 0; i < 100; i++ {
wg.Add(1)
}5)在启动子线程
go doAction(i, &wg, result)
6)包装结果,通知线程管理组
在子线程里面我们主要做3件事情,分别是:
处理正常的子线程业务。 通知线程管理组结果。 把结果放到通道里面去。
所以这里的示例代码如下:
func doAction(index int, wg *sync.WaitGroup, result chan r) {
fmt.Println("doAction task no:" + strconv.Itoa(index))
defer wg.Done()
result <- r{
index, index + 100,
}
}7)主线程等待子线程全部完成
wg.Wait()
8)主线程获取子线程的执行结果
这里等待所有子线程都执行完毕之后,我们就可以获取结果了,这里和java的future效果是一样的。
for j := 0; j < 100; j++ {
dd := <-result
fmt.Println("多线程执行返回的结果是:", dd)
}最后我们来执行下这个代码,看是否可以获取到执行结果:
可以看到完全没有问题,很直观的返回了结果。最后按照惯例,附上本案例的源码,登录后即可下载


还没有评论,来说两句吧...