当前位置: 首页>移动开发>正文

java 线程数与cpu的核数是什么关系 java线程和内核线程


文章目录

  • 一、线程的三种实现方式
  • 1.1 内核线程实现
  • 1.2 用户线程实现
  • 1.3 用户线程加轻量级进程实现
  • 二、两种线程调度的主要方式
  • 2.1 协同式调度
  • 2.2 抢占式调度
  • 三、用优先级确定线程先执行是不可靠的
  • 四、Java线程的状态


java线程的实现是与平台相关的。因为Thread的很多关键方法都是native的。
线程的引入将进程的资源分配线程调度分开了。线程是cpu调度的基本单位,进程是资源分配的基本单位。


一、线程的三种实现方式

1.1 内核线程实现

内核线程(kernel-level Thread,klt)。轻量级进程(Light Weight Process,LWP),每一个轻量级进程都与一个内核线程相关。下面是轻量级进程、内核线程之间的关系:

java 线程数与cpu的核数是什么关系 java线程和内核线程,java 线程数与cpu的核数是什么关系 java线程和内核线程_优先级,第1张

用户线程实现方式有缺陷:

  1. 需要进行系统调用。由于线程的调用、切换、创建都需要进行系统调用,而系统调用需要与在用户态与核心态进行切换,这是要花费代价的。
  2. 系统支持轻量级进程的个数是有限的。因为系统的内核线程需要占用内核资源的。

1.2 用户线程实现

java 线程数与cpu的核数是什么关系 java线程和内核线程,java 线程数与cpu的核数是什么关系 java线程和内核线程_优先级_02,第2张

用户线程优点就是不需要内核的参与。缺点就是线程的切换、创建、调度、阻塞如何处理都需要用户程序自己处理。这回比较困难,有些甚至还实现不了。

1.3 用户线程加轻量级进程实现

java 线程数与cpu的核数是什么关系 java线程和内核线程,java 线程数与cpu的核数是什么关系 java线程和内核线程_用户线程_03,第3张

这种方式应该是集上面两种方式的优点吧。首先线程的创建、切换、析构依然廉价,因为是在用户态嘛,由于可以使用轻量级进程,就可以使用内核的线程调度,大大降低了进程被完全阻塞的可能。


二、两种线程调度的主要方式

2.1 协同式调度

协同式调度是由线程自身决定执行时间,执行完后主动通知操作系统切换到另一个线程。这带来个问题,如果线程自身迟迟不通知操作系统,那么其他线程就无法执行了。

2.2 抢占式调度

抢占式调度中线程的执行时间由系统分配。

三、用优先级确定线程先执行是不可靠的

我们可以通过给线程设置优先级(Priority,Java中有10级别),来“建议”给线程多分配执行时间。优先级越高的线程越有可能被先调度执行。
然而这是不可靠的:

  1. Java线程优先级与各种操作系统的线程优先级并不是一一对应的
  2. 优先级可能会被系统改变。当系统发现一个线程特别“勤奋努力”,系统就可能会越过优先级给它分派执行时间。

四、Java线程的状态

在看之前,先看一下操作系统基础

  1. 新建状态(New)
  2. 运行状态(Runable):这个状态对应于操作系统的runing、ready(运行、就绪)状态,也就是在此状态的线程可能正在运行,也可能获取了系统资源,正在等待被cpu调度。
  3. 无限期等待(Waiting):这种状态,表示线程没有分配cpu资源,需要被系统唤醒才行。通过Object.wait()、Thread.join()、LockSupport.part()这三个方法(注意是没有TimeOut参数的)来让线程处于无限期等待状态。
  4. 限期等待(Timed Waiting):这个状态也不会分配Cpu资源。与无限期等待的区别是时间一到就会由系统唤醒。可以通过Thread.sleep()方法,带Timeout参数的Object.wait()/Thread.join(),LockSupport.parkNanos(),LockSupport.parkUntil方法来让线程进入这个状态。
  5. 阻塞状态(Blocked):阻塞状态与等待状态的区别在于阻塞状态等待的是一个排它锁。而等待状态等待的是一段时间或唤醒动作的发生。当程序等待进入同步区域时,线程会进入这种状态。
  6. 结束状态(Terminated):以终止线程的线程状态,线程已经执行结束。

java 线程数与cpu的核数是什么关系 java线程和内核线程,java 线程数与cpu的核数是什么关系 java线程和内核线程_优先级_04,第4张



https://www.xamrdz.com/mobile/4uj1962590.html

相关文章: