Go语言中的多线程和协程是两种不同的并发编程技术。多线程是指创建多个线程,每个线程都有自己的内存空间和执行环境,可以同时运行多个任务。而协程(coroutines)是一种轻量级的并发机制,它允许Go程序在不创建新的线程的情况下实现并发,通常用于处理I/O密集型任务。
以下是一个简单的Go语言并发编程实战示例,使用多线程和协程分别实现一个任务:
1. 使用多线程实现任务:
```go
package main
import (
"fmt"
"time"
)
func multiThreadTask(taskName string) {
for i := 0; i < 10; i++ {
fmt.Printf("线程 %d: %s
", i, taskName)
time.Sleep(time.Second * 2)
}
}
func main() {
threadCount := 5
for i := 0; i < threadCount; i++ {
fmt.Println("开始创建线程...")
ticker := time.NewTicker(time.Second)
defer ticker.Stop()
for {
select {
case <-ticker.C:
multiThreadTask("线程 " + strconv.Itoa(i))
case <-time.After(time.Second):
fmt.Println("线程已结束")
break
}
}
}
}
```
2. 使用协程实现任务:
```go
package main
import (
"fmt"
"sync"
)
func coroutineTask(taskName string) {
ch := make(chan string)
go func() {
for i := 0; i < 10; i++ {
- ch <
- taskName
time.Sleep(time.Second * 2)
}
}()
<-ch
}
func main() {
ch := make(chan string)
go coroutineTask("协程任务")
for i := 0; i < 3; i++ {
- ch <
- "任务完成"
}
}
```
在这个示例中,我们使用了Go语言的`sync.Mutex`来确保协程之间不会互相阻塞。通过`go`关键字启动协程,并在协程中使用`<-ch`接收来自主线程的消息。这样,我们可以在不创建新线程的情况下实现并发。