之前对java多线程了解不足,在java多线程编程这块存在如下疑惑:
随便写个java多线程程序,然后放到多核机子上运行时,多个线程是否会分配到多个cpu上并行执行?是自动分配?还是java api中能指定具体线程到具体cpu上运行?
查了许多资料,以下是我自己的理解,有什么不对之处请回复指正。
网上有个网友说的这句话蛮有道理的:
CPU是为了迎合操作系统的多线程从而提高系统的计算效率.但是具体分配任务到各个内核中去执行的并非JAVA与JVM而是操作系统.也就是说,你所执行的多线程,可能会被分配到同一个CPU内核中运行.也可能非配到不同的cpu中运行.如果可以控制CPU的分配,那也应该是操作系统的api才能实现的了
然后我就顺着这个思路查了些资料。
一个java程序代表一个进程,这个进程中会有多个线程被创建,启动。
而线程的实现方式如下:
1. 使用内核线程实现:
内核线程Kernel Thread:直接由操作系统内核支持的线程,这种线程由内核类完成线程切换,内核通过操纵调度器对线程进行调度,并负责将线程的任务映射到各个处理器上。
轻量级进程Light Weight Process:每个轻量级进程都由一个内核线程支持。
局限性:各种进程操作都需要进行系统调用(系统调用代价相对较高,需要在用户态和内核态中来回切换);轻量级进程要消耗一定的内核资源,一次一个系统支持轻量级进程的数量是有限的。
2. 使用用户线程实现:
用户线程:完全建立在用户空间的线程库上,系统内核不能直接感知到线程存在的实现。用户线程的建立、同步、销毁和调度完全在用户态中完成,不需要内核的帮助。所有的线程操作都需要用户程序自己处理。
混合实现:
将内核线程和用户线程一起使用的方式。操作系统提供支持的轻量级进程则作为用户线程和内核线程之间的桥梁。
Sun JDK,它的Windows版和Linux版都是使用一对一的线程模型来实现的,一条Java线程映射到一条轻量级进程之中。
从上面线程实现的红字中可以得出 java线程最终由操作系统内核通过操纵调度器对线程进行调度,并负责将线程的任务映射到各个处理器上。
同时还试着查询jdk中是否存在API,没有找到。反而在知乎找到个帖子上面有C++的实现的函数方法
http://www.zhihu.com/question/19902075。