golang中的定时器
1. timer 定时器,时间到了执行,只执行一次
package main import (
"fmt"
"time"
) func main() {
// 1. timer基本使用
/*
timer1 := time.NewTimer(2 * time.Second)
t := time.Now()
fmt.Printf("t = %v\n", t)
t2 := <-timer1.C
fmt.Printf("t2 = %v\n", t2)
*/ // 2. 验证timer只能响应一次
/*
timer2 := time.NewTimer(time.Second)
for {
<-timer2.C // 第一次打印时间到,第二次就会死锁(原因:timer2定时器只往通道中发送一次Time数据)
fmt.Println("时间到")
}
*/ // 3. timer实现延时的功能
/*
fmt.Println("开始了", time.Now())
time.Sleep(time.Second)
fmt.Println("第一次延时:", time.Now())
timer3 := time.NewTimer(2 * time.Second)
<-timer3.C
fmt.Println("第二次延时:", time.Now())
<-time.After(3 * time.Second) // time.After() 就是对 NewTimer(d).C 的封装
fmt.Println("第三次延时:", time.Now())
*/ // 4. 停止定时器
/*
timer4 := time.NewTimer(2 * time.Second)
go func() {
<-timer4.C
fmt.Println("定时器执行了")
}()
//time.Sleep(3 * time.Second)
// 注意:如果定时器执行了,然后在调用timer4.Stop()就会返回false,如果没有执行就调用Stop()就会返回true
// 定时器一旦被关闭,从定时器通道中读取数据和后面的代码将不会在执行
b := timer4.Stop()
if b {
fmt.Println("timer4已经关闭")
}
for { }
*/ // 5. 重置定时器
fmt.Println(time.Now())
timer6 := time.NewTimer(3 * time.Second)
timer6.Reset(time.Second)
fmt.Println(<-timer6.C) }
2. Ticker:时间到了,多次执行
package main import (
"fmt"
"sync"
"time"
) var wg sync.WaitGroup func main() {
// 2. ticker 定时器,时间到了多次执行
ticker := time.NewTicker(1 * time.Second)
wg.Add(1)
go func() {
i := 1
for {
fmt.Println(<-ticker.C)
if i == 5 {
ticker.Stop()
break
}
i++
}
wg.Done()
fmt.Println("子 goroutine结束了")
}() wg.Wait()
fmt.Println("主 goroutine 结束了...") }
golang中的定时器的更多相关文章
- golang 中的定时器(timer),更巧妙的处理timeout
今天看到kite项目中的一段代码,发现挺有意思的. // generateToken returns a JWT token string. Please see the URL for detail ...
- golang中的race检测
golang中的race检测 由于golang中的go是非常方便的,加上函数又非常容易隐藏go. 所以很多时候,当我们写出一个程序的时候,我们并不知道这个程序在并发情况下会不会出现什么问题. 所以在本 ...
- 浅谈JavaScript中的定时器
引言 使用setTimeout()和setInterval()创建的定时器可以实现很多有意思的功能.很多人认为定时器是一个单独的线程(之前我也是),但是JavaScript是运行在单线程环境中的,而定 ...
- 第十四篇:在SOUI中使用定时器
前言 定时器是win32编程中常用的制作动画效果的手段.在Win32编程中,可以使用::SetTimer来创建定时器,定时器消息会被会发到调用SetTimer时指定的HWND. 在SOUI中一般来说只 ...
- 基础知识 - Golang 中的正则表达式
------------------------------------------------------------ Golang中的正则表达式 ------------------------- ...
- cocos2dx中的定时器及其分类
cocos2dx中的定时器分三大类: 1.帧循环定时器 2.一次性定时器 3.自定义定时器 一.帧循环定时器,顾名思义,每一帧都会执行一次,用于实时性要求比较高的场合,如碰撞检测 void sched ...
- C++控制台程序中使用定时器
转自博客:http://www.cnblogs.com/phinecos/archive/2008/03/08/1096691.html 作者:洞庭散人 “我现在项目是一个控制台程序,用到的Win32 ...
- 在Android开发中,定时器一般有以下3种实现方法
在Android开发中,定时器一般有以下3种实现方法: 原文地址http://www.360doc.com/content/12/0619/13/87000_219180978.shtml 一.采用H ...
- Qt中使用定时器(可使用QObject::timerEvent定时执行,QTimer::singleShot可只触发一次)
在Qt中使用定时器有两种方法,一种是使用QObiect类的定时器:一种是使用QTimer类.定时器的精确性依赖于操作系统和硬件,大多数平台支持20ms的精确度 1.QObject类的定时器 QObje ...
随机推荐
- SQL注入绕过
空格字符绕过 %09 TAB建(水平) %0a 新建一行,换行 %0b TAB建(垂直) %0c 新的一页 %0d return 功能 %a0 空格 %00 /**/ /*!*/./*!50009*/ ...
- git命令行常用操作总结
关于 更多使用细节(grammar和book),请参考 官网 1.上传代码 1.1 创建自己的远程Repository, github或者gitee 1.2 创建本地git仓库 $ git init ...
- 【LeetCode】478. Generate Random Point in a Circle 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 题目地址: https://leetcode.com/problems/generate ...
- 教学日志:javaSE-数组
一.一维数组 import java.util.Scanner; /* 数组:存储一组相同数据类型的有序集合. 特点: 1.数组中的元素必须是同一种数据类型,可以是基本数据类型,也可以是引用数据类型 ...
- centos 与虚拟机
一 创建虚拟机 1. 下载 centos7 和 vmware .centos的下载地址:见上一篇. 2.安装vmware ,具体安装过程,自行百度(一路点击确定) 3.打开vmware ,点击创建新的 ...
- JSP中使用<c:forEach>标签循环遍历元素
1.forEach标签元素 <c:forEach items="接收集合对象" var="迭代参数名称" varStatus="迭代状态,可访问 ...
- Java高效开发-fiddler抓包工具
1.简介 Fiddler是最常用的抓包工具之一,只要打开之后就能够实现数据包抓取,关闭之后会自动取消代理,非常方便本地调试 2.下载 阿里云盘地址:https://www.aliyundrive.co ...
- Java常用的开发库推荐
我是3y,一年CRUD经验用十年的markdown程序员 今天来讲讲来给大家聊聊开发提速的东西了:工具包.Lombok和常用库 01.什么是工具包 基本上,每个项目里都有一个包,叫做utils.这个 ...
- linux的用户主目录(~)指向问题
最近在Ubuntu上安装rabbitmq之后,发现~目录指向出问题了,原本~指向当前shell登录的用户主目录,如下图 现在变成了这样: 登录之后进入的不是~目录,而是直接显示的主目录,而~指向的目录 ...
- Linux上天之路(十一)之软件管理
软件包格式: RPM:源码封装后的格式,类似于exe文件 源码:软件源代码,可以修改,优化 1. RPM软件包管理 rpm是一个很有用的包管理器,可以用于生成.安装.查询.核实.更新以及卸载单个软件包 ...