在前面我们介绍了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) }
最后我们来执行下这个代码,看是否可以获取到执行结果:
可以看到完全没有问题,很直观的返回了结果。最后按照惯例,附上本案例的源码,登录后即可下载
还没有评论,来说两句吧...