java,go 保证所有子线程都执行完毕

往往有这样一个情景:需要在子线程完成一些操作,然后在主线程中进行汇总操作。

那么,如何保证主线程操作时,所有子线程都已经执行完毕?

 

一、java

1.如果不使用线程池,那么使用join()

test.java

在这里,如果在主线程中不采取操作确保所有子线程都运行结束,那么将线程执行的顺序将会有问题(在这里,体现在syso(“end”)不会在最后输出,而是在子线程执行过程中就输出了)。

如果在这样的情境下:在主线程中开启10条子线程,分别进行一系列的运算,最后在主线程中进行汇总,并且输出结果。那么还没等子线程跑完,主线程中就已经汇总完毕了,这样得出的结果肯定是错误的。所以这样不符合我们的要求。

怎么改进?可以获取所有的线程信息,然后在主线程中使用join方法,保证所有子线程先执行完毕。

test.java

用一个List获取当前所有子线程的信息,在主线程操作前,保证List中的子线程都先执行完毕。

这里的List只有主线程能够进行操作,不会被其他线程访问或修改,所以这样使用基本上是安全的。

2.使用线程池,使用awaitTermination()

test.java

这里使用了awaitTermination方法,看看这个方法的作用:

Blocks until all tasks have completed execution after a shutdown request, or the timeout occurs, or the current thread is interrupted, whichever happens first.

awaitTermination用于等待线程池中所有子线程结束,再继续执行下面的代码。

二、Go

1.类似于java,使用channel

test.go

思路还是比较清晰的,就是启动多少个goroutine,就要通过channel得到多少个标示。当得到所有标示,那就表示所有goroutine都执行完毕了,可以执行下面的代码。

2.使用sync同步等待组

test.go

使用同步等待组,可以保证组中的所有goroutines执行完毕后,才继续执行。

三、总结

比较常用的一些写法。

发表评论

电子邮件地址不会被公开。 必填项已用*标注