java的多线程在golang中是如何体现的

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java的多线程在golang中是如何体现的相关的知识,希望对你有一定的参考价值。

参考技术A

golang语言中实现Java的多线程主要是使用LockOSThread() 方法,代码如下:


package mainimport (    "log"    "runtime"    "time")func main()     runtime.GOMAXPROCS(1)    for i := 0; i < 10; i++         go func()             //runtime.LockOSThread()            for                 log.Println("a")                time.Sleep(time.Second)                    ()        time.Sleep(time.Hour)

运行之后,就会产生10个进程,如下截图:

Golang线程模型

Golang是基于多线程模型的。这里的线程和C/C++的线程概念稍有不同,Golang中不直接使用线程。

Golang中是没有线程的概念,用的是协程,即goroutine

先看一下进程、线程、协程这几个概念:




协程:和线程类似,共享堆,不共享栈,协程的切换由Go的调度器来进行调度。


Golang有一个环境变量GOMAXPROCS,决定了Go运行库最多会启动几个线程来运行goroutine。一般GOMAXPROCS设置为CPU数。


所以,一个Go程序是一个进程,进程里有数个线程,进程里还有数个协程,一个或几个协程对应一个线程。


讲解GO线程模型的一般用这样几个符号:

M:OS线程

P:Goroutine所必须的上下文环境

G:Goroutine

调度器: 管理和调度 M, P, G


因此,协程与线程主要区别是,协程将不再被内核调度,而是交给了程序自己的调度器来调度,而线程是由内核调度。从调度上看,goroutine的调度开销远远小于线程调度开销。


从关系上可以看下图:

 

一个OS线程和一个上下文绑定,一个上下文可以挂几个协程,由Go调度器来分配、调度他们。


以上是关于java的多线程在golang中是如何体现的的主要内容,如果未能解决你的问题,请参考以下文章

如何限制Java程序中的多线程?

VB中的多线程

如何实现springMVC的多线程并发?

如何实现springMVC的多线程并发?

java Servlet 的多线程如何工作? [复制]

说说java中的多线程