【Golang】goruntine 等待所有线程结束后执行

简介: goruntine 等待所有线程结束后执行

在使用 go 的 goroutine 时主线程不需要等待其它线程结束就可以继续执行后续操作,但有时有些业务逻辑的处理需要等待所有线程结束后才能执行,这个时候可以使用 sync.WaitGroup

直接上代码:

import (
    "fmt"
    "sync"
)

var wg sync.WaitGroup
wg.Add(2)

go func(){
    time.Sleep(time.Duration(1) * time.Second)
    fmt.Println("test1")
    wg.Done() // wg.Add(-1)
}()

go func(){
    time.Sleep(time.Duration(3) * time.Second)
    fmt.Println("test2")
    wg.Done() // wg.Add(-1)
}()

wg.Wait()
fmt.Println("end.")

执行结果:

test1
test2
end.

如果不启用sync.WaitGroup执行结果会是:

end.
test1
test2

End.

相关文章
|
7月前
|
缓存 安全 Go
浅谈Golang线程安全的sync.Map
浅谈Golang线程安全的sync.Map
86 0
|
安全 Java
【JavaSE专栏76】三态和五态,线程的不同状态:新建、运行、状态、阻塞、等待、计时等待状态
【JavaSE专栏76】三态和五态,线程的不同状态:新建、运行、状态、阻塞、等待、计时等待状态
108 0
|
Java 程序员 调度
如何用Java编写代码来等待一个线程join()??
如何用Java编写代码来等待一个线程join()??
42 0
|
5月前
|
Java C# Python
线程等待(Thread Sleep)
线程等待(Thread Sleep)
|
5月前
|
测试技术
三种等待方式(‌线程等待、‌隐式等待、‌显式等待)
三种等待方式(‌线程等待、‌隐式等待、‌显式等待)
251 4
|
6月前
|
安全 Java
使用notifyAll唤醒所有等待线程
使用notifyAll唤醒所有等待线程
|
5月前
|
安全 Java
使用notifyAll唤醒所有等待线程
使用notifyAll唤醒所有等待线程
|
6月前
|
Java
死锁是线程间争夺资源造成的无限等待现象,Java示例展示了两个线程各自持有资源并等待对方释放,导致死锁。`
【6月更文挑战第20天】死锁是线程间争夺资源造成的无限等待现象,Java示例展示了两个线程各自持有资源并等待对方释放,导致死锁。`volatile`保证变量的可见性和部分原子性,确保多线程环境中值的即时更新。与`synchronized`相比,`volatile`作用于单个变量,不保证原子操作,同步范围有限,但开销较小。`synchronized`提供更全面的内存语义,保证原子性和可见性,适用于复杂并发控制。
48 3
|
6月前
|
Java
使用notifyAll唤醒所有等待线程的方法与比较
使用notifyAll唤醒所有等待线程的方法与比较
|
7月前
|
Java API 分布式数据库
实时计算 Flink版产品使用合集之如何解决 TaskManager和 JobManager中有大量的等待线程
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
110 1