提问:
用golang写一个启动函数 start(n) 和对应的停止函数stopAll(),. start函数功能:启动n个线程,线程循环打印日志,stopAll()函数功能:停止start启动的线程
以下是一个示例的Golang代码,其中包括 `start` 函数用于启动n个线程,这些线程会循环打印日志,并且 `stopAll` 函数用于停止 `start` 启动的线程。
```go 代码
package main
import (
"fmt"
"sync"
"time"
)
// Worker 表示一个工作线程
type Worker struct {
id int
stopCh chan struct{}
stopped chan struct{}
}
// NewWorker 创建一个新的工作线程
func NewWorker(id int) *Worker {
return &Worker{
id: id,
stopCh: make(chan struct{}),
stopped: make(chan struct{}),
}
}
// Start 启动工作线程,开始打印日志
func (w *Worker) Start() {
go func() {
defer close(w.stopped)
for {
select {
case <-w.stopCh:
return
default:
fmt.Printf("Worker %d: Logging...\n", w.id)
time.Sleep(1 * time.Second)
}
}
}()
}
// Stop 停止工作线程
func (w *Worker) Stop() {
close(w.stopCh)
<-w.stopped
fmt.Printf("Worker %d: Stopped.\n", w.id)
}
var (
workers []*Worker
wg sync.WaitGroup
)
// Start 启动n个工作线程
func Start(n int) {
for i := 0; i < n; i++ {
worker := NewWorker(i)
worker.Start()
workers = append(workers, worker)
}
fmt.Printf("Started %d workers.\n", n)
}
// StopAll 停止所有工作线程
func StopAll() {
for _, worker := range workers {
worker.Stop()
}
fmt.Println("Stopped all workers.")
}
func main() {
n := 3 // 设置要启动的线程数量
Start(n)
// 在这里等待一段时间,以便观察线程的运行
time.Sleep(5 * time.Second)
StopAll()
}
```
在这个示例中,我们创建了一个 `Worker` 结构,每个工作线程都有一个独立的 `stopCh` 通道用于停止线程,并且有一个 `stopped` 通道用于表示线程已经停止。 `Start` 函数用于启动n个工作线程,它们会循环打印日志,而 `StopAll` 函数会停止所有工作线程。