杂谈
快来分享你的内容吧~
Thread-Per-Message模式, 简而言之就是一个任务一个线程. 但是在Java中,这种模式一般不具有可行性,Java中的线程对应到操作系统中是内核级线程, 内核级线程的创建和销毁太重了,如果一个任务一个线程的话,那么线程随着任务的开始而创建,随着任务的结束而销毁. 奈何Java的线程对应的是内核级线程, 这样的好处是不需要线程不需要Java层面来调度管理,完全可以交给对线程调度玩的很溜的操作系统, 但是也带来了缺点,那就是操作系统创建线程开销太大了. 那是否这种方案就不能用了呢? 并不是, 我们可以用线程池,不过会增加复杂度. 但是如果我们跳出Java语言, 比如Go语言, go语言中有一个概念goroutine, 他是go语言中,并发执行的基本单元,和Java的Thread一样,但是goroutine的调度不直接交给操作系统,而是由go的运行时负责调度, 并有策略的将goroutine中的任务委托给操作系统中的内核级线程. 具体的调度策略就不详细说明. 由此,我们会称goroutine是轻量级线程. 但是这种思想并不新鲜,而是早就存在.这种思想是这样的,既然操作系统创建线程的代价这么大,那么我们可以模拟内核级线程的数据结构和行为,并由我们自己调度, 等到真正需要并行执行的时候,再将这些模拟线程中的任务交给内核级线程去执行,内核级线程由于被操作系统调度,操作系统能够控制CPU,所以就能够让内核级线程跑在不同的CPU上,实现真正的并行. 而这种被我们模拟出现的线程被叫做用户级线程,也称为轻量级线程. 以上是我的推论, 手头上有几份资料,但是最近时间有点紧,还没有时间去验证.如果你觉得我说的不对,那么可能是真的不对,希望你指出. #记录# #杂谈#
