Thread vs Groutine
- 创建时默认的stack的大小
- JDK5以后Java Thread stack默认为1M
- Groutine的stack初始化大小为2k
协程是更轻量级的线程
- 和KSE(kernel space Entity)的对应关系
- Java Thread是1:1
- Grountine是M:N
如何提高并发能力
- 协程处理器启动时,计数器记录协程数量,当协程数量过一段时间不变时,做一个标记,遇到非内联函数,中断当前协程,把他放到协程队列的队尾。这就能处理单个协程处理时间过长的问题。
- 协程被系统线程中断时,如IO,协程处理器移动到另外一个系统线程中,继续执行队列中的协程,被中断的协程被唤醒时,它会被加入到某个processor的等待队列里,或全局等待队列里。
package groutine_test
import (
"fmt"
"testing"
"time"
)
func TestGroutine(t *testing.T) {
var a int
a = 5
fmt.Println(a)
for i := 0; i < 10; i++ {
go func(i int) {
//time.Sleep(time.Second * 1)
fmt.Println(i)
}(i)
}
time.Sleep(time.Millisecond * 50)
}