面试题答案
一键面试不同点
- 执行次数:
- Timer:只执行一次定时任务。它设定一个时间间隔,时间一到就触发一次相应的动作。
- Ticker:周期性地执行定时任务。按照设定的时间间隔,不断地重复触发任务。
- 使用场景:
- Timer:适用于需要在未来某个特定时间点执行一次的任务,比如超时控制、延迟操作等。例如,一个网络请求设置了5秒的超时时间,如果5秒内没有收到响应,则执行超时处理逻辑。
- Ticker:适用于需要周期性执行的任务,如定时数据采集、定时备份等。比如每10分钟检查一次系统资源使用情况并记录日志。
代码示例
Timer示例
package main
import (
"fmt"
"time"
)
func main() {
timer := time.NewTimer(2 * time.Second)
fmt.Println("Start waiting...")
<-timer.C
fmt.Println("Timer fired")
}
在这个示例中,time.NewTimer(2 * time.Second)
创建了一个2秒后触发的Timer。<-timer.C
会阻塞当前 goroutine,直到Timer触发,然后打印 "Timer fired"。
Ticker示例
package main
import (
"fmt"
"time"
)
func main() {
ticker := time.NewTicker(1 * time.Second)
defer ticker.Stop()
go func() {
for {
select {
case <-ticker.C:
fmt.Println("Ticker fired")
}
}
}()
time.Sleep(5 * time.Second)
}
在这个示例中,time.NewTicker(1 * time.Second)
创建了一个每秒触发一次的Ticker。在匿名goroutine中,通过 select
监听 ticker.C
通道,每次通道接收到数据时(即每1秒),打印 "Ticker fired"。time.Sleep(5 * time.Second)
用于让主goroutine等待5秒,以便观察Ticker的多次触发。defer ticker.Stop()
用于在程序结束时停止Ticker,避免资源泄漏。