协程控制

package main

import (
	"fmt"
	"sync"
	"time"
)

type Task struct {
	ticker   *time.Ticker
	runFunc  func()
	stopChan chan struct{}
	isRun    bool
	mu       sync.Mutex
}

func NewTask(interval time.Duration, runFunc func()) *Task {
	return &Task{ticker: time.NewTicker(interval), runFunc: runFunc, stopChan: make(chan struct{}), isRun: false}
}

func (t *Task) Start() {
	if t.isRun {
		return
	}
	t.isRun = true
	go func() {
		for {
			select {
			case <-t.ticker.C:
				t.runFunc()
			case <-t.stopChan:
				t.ticker.Stop()
				return
			}
		}
	}()
}

func (t *Task) Stop() {
	if !t.isRun {
		return
	}
	t.isRun = false
	t.stopChan <- struct{}{}
}

func main() {
	task := NewTask(time.Second*2, func() {
		fmt.Println("Task is running")
	})
	task.Start()
	time.Sleep(time.Second * 10)
	task.Stop()
}

最后更新于