如何定期安排一项任务



对于生产用例,go lang上的java原生库是否有任何像ScheduledExecutorService这样的原生库或第三方支持?

请在java 1.8:中找到代码片段

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class TaskScheduler {
/**
* @param args
*/
public static void main(String[] args) {
Runnable runnable = ()-> {
// task to run goes here
System.out.println("Hello !!");
};
ScheduledExecutorService service = Executors.newScheduledThreadPool(1);
service.scheduleAtFixedRate(runnable, 0, 1, TimeUnit.SECONDS);
}
}

它将在每一秒钟内打印Hello !!

无需使用第三方库即可实现。只需利用goroutine的优势,使用time包中可用的time.Sleep()API,就可以获得完全相同的结果。

示例:

go func() {
for true {
fmt.Println("Hello !!")
time.Sleep(1 * time.Second)
}
}()

游乐场:https://play.golang.org/p/IMV_IAt-VQX


使用股票代码#1的示例

根据Siddhanta的建议。下面是一个使用ticker(取自ticker的go文档页面,根据您的要求进行了一些修改(来实现相同结果的示例。

done := make(chan bool)
ticker := time.NewTicker(1 * time.Second)
go func() {
for {
select {
case <-done:
ticker.Stop()
return
case <-ticker.C:
fmt.Println("Hello !!")
}
}
}()
// wait for 10 seconds
time.Sleep(10 *time.Second)
done <- true

可以从ticker.C频道获取股票行情时间信息(执行Hello !!的时间(。

case t := <-ticker.C:
fmt.Println(t)

游乐场:https://play.golang.org/p/TN2M-AMr39L


使用股票代码#2的示例

ticker的另一个简化示例,取自https://gobyexample.com/tickers

ticker := time.NewTicker(1 * time.Second)
go func() {
for range ticker.C {
fmt.Println("Hello !!")
}
}()
// wait for 10 seconds
time.Sleep(10 *time.Second)
ticker.Stop()

最新更新