面试题答案
一键面试实现思路
- 使用Go语言的通道(channel)来实现任务间的同步。
- 启动任务A,任务A完成后向一个通道发送信号。
- 任务B在接收到任务A完成的信号后开始执行。
- 任务C可以与任务A并发执行,无需等待任务A完成。
关键代码
package main
import (
"fmt"
"time"
)
func taskA(done chan struct{}) {
fmt.Println("Task A started")
time.Sleep(2 * time.Second) // 模拟任务A执行
fmt.Println("Task A finished")
close(done) // 任务A完成,关闭通道
}
func taskB(done <-chan struct{}) {
<-done // 等待任务A完成的信号
fmt.Println("Task B started")
time.Sleep(1 * time.Second) // 模拟任务B执行
fmt.Println("Task B finished")
}
func taskC() {
fmt.Println("Task C started")
time.Sleep(3 * time.Second) // 模拟任务C执行
fmt.Println("Task C finished")
}
func main() {
done := make(chan struct{})
go taskA(done)
go taskB(done)
go taskC()
time.Sleep(4 * time.Second) // 等待所有任务完成
}
在上述代码中:
taskA
函数完成后关闭done
通道,以通知其他任务任务A已完成。taskB
函数在接收到done
通道的信号(通道关闭)后开始执行。taskC
函数直接并发执行,不依赖任务A的完成信号。- 在
main
函数中,启动三个任务,通过time.Sleep
等待足够时间让所有任务执行完毕。实际应用中可能需要更优雅的同步机制来确保所有任务完成。