6
回答
【疑惑】Java的多线程与“用户级线程”/“核心级线程”的疑惑
利用AWS快速构建适用于生产的无服务器应用程序,免费试用12个月>>>   

翻阅操作系统的书 得到两个概念,“用户级线程”和“核心级线程”, 而且列举了用户级线程的优缺点。其中,讲到用户级线程的缺点的地方有两点:1、统一进程的多个线程不能真正并行;2、由于线程对操作系统透明,调度处于进程级别,若进程中的一个线程通过系统调用进入操作系统受阻,那么将阻塞该进程

疑惑来了,反思Java的多线程实现是用户级线程:
1、那么Java的多线程实现并发怎么回事,难道骗人的?(CPU多核?)
2、用户级线程调度发生在进程级别,与核心级线程的调度有何区别。
3、网上看到这一说法,求证:内核级线程可以享受到多核的好处?那用户级线程就不能?(参照第一条)

举报
Glogo
发帖于4年前 6回/417阅
共有6个答案 最后回答: 4年前
哈。java没研究过,只能了解怎么用,也挺好奇这个问题的,java这块,实际的实现机理是什么呢?

现在java几乎都用的操作系统线程,以linux为例,一个Thread.run会调用一个fork产生一个线程。jvm保留了策略影响调度,实现交给了OS

--- 共有 6 条评论 ---
gvim回复 @Glogo : 那你想了解什么?我知道的就告诉你。 4年前 回复
Glogo回复 @gvim : 老师要能解决也不会来这里 4年前 回复
gvim回复 @Glogo : 你想了解什么?不过个人建议如果你有老师,如果你付了高昂的学费,那么你该去找老师了解清楚。 4年前 回复
Glogo回复 @gvim : 那可不可以讲的详细些呢?你是指1:1那个么 4年前 回复
gvim回复 @Glogo : 哥们,了解下实质和区别再说吧,别看fork就想当然尔。 4年前 回复
用户级不用切换到内核级,对于cpu来说也就是一个进程罢了,内核级一个线程由于io等阻塞其他照样执行,用户级享受不了多核优势,谁告诉你java是用户级,好歹也是靠系统调用吃饭的!
--- 共有 1 条评论 ---
GlogoThink in Java 4年前 回复

Linux上单线程工作进程用epoll轮询一样能实现高并发,把工作进程绑定到CPU核心一样能充分利用多核,Nginx就是典型的例子。

另外以可靠和高并发著称的Erlang就在自己的VM上维护有轻量级进程和调度器,Erlang VM里新建进程的开销比系统级新建线程小得多,而且VM里的进程间切换不需要系统进行上下文切换,效率非常高。另外Erlang是支持SMP的,也能充分利用多核。

不过Java应用里的线程应该会对应到系统里的线程,我在Linux上比较起始和用siege压力测试时Tomcat8开启的Java线程数,发现压力测试时Java系统级线程增多,可以这样查看:
cat /proc/`pgrep java`/status |grep Threads

顶部