多线程
进程与线程
- 进程:进程就是应用程序在内存中分配的空间,也就是正在运行的程序,各个进程之间互不干扰。同时进程保存着程序每一个时刻运行的状态。
- 线程:是进程中的一个实体,是被系统调度和分配的基本单元。
并发与并行
- 并发:把任务在不同的时间点交给处理器进行处理。在同一时间点,任务并不会同时运行。
- 并行:把每一个任务分配给每一个处理器独立完成。在同一时间点,任务一定是同时运行。
用户级线程与内核级线程
用户级线程:是在用户空间中创建和管理的线程,而不依赖于操作系统的线程管理机制。用户级线程是由应用程序开发者直接创建和控制的,而不需要操作系统的干预。
内核级线程:是由操作系统内核直接创建、调度和管理的线程。与用户级线程相比,内核级线程的创建和管理是由操作系统提供的线程管理机制来完成的。
优先级
Java线程优先级和windows线程优先级的对应关系:
如果线程的优先级能起到的作用有限,除了优先级还有其他很多影响系统调度的因素。
Java多线程模型
多线程测试
package com.zyh.java;
public class Main {
public static void main(String[] args) {
Thread t1 = new Thread(MyThread::computer);
Thread t2 = new Thread(MyThread::computer);
Thread t3 = new Thread(MyThread::computer);
Thread t4 = new Thread(MyThread::computer);
t1.start();
t2.start();
t3.start();
t4.start();
}
}
class MyThread{
static void computer(){
long startTime = System.currentTimeMillis();
int result = computeFactorial(500);
long endTime = System.currentTimeMillis();
long elapsedTime = endTime - startTime;
System.out.println("1" + result);
System.out.println("2" + elapsedTime + " 毫秒");
}
private static int computeFactorial(int n) {
if (n == 0) {
return 1;
}else if(n==1){
return 1;
}
else {
return computeFactorial(n - 2) + computeFactorial(n - 1);
}
}
}
cpu利用率
若只采用3个线程则是有3个核心利用率达到100%,由此可见,Java的多线程虽然是有jvm管理的,但最终还是将线程映射到内核线程上了。当然,当jvm中管理的线程大于cpu提供的线程数,则jvm则会将多个Java程序的线程映射到同一个系统级线程上。上述两种情况下,一个进程是并行的运行在多个核心上。在后一种情况下,在进行线程调度时,只需要切换线程自己的上下文,寄存器等数据,而不需要保存进程共享的数据。例如在切换统一进程的不同线程时,L1 L2缓存是不会发生切换的,因为两个线程共享内存地址空间。如果是进程切换则会发生L1 L2的缓存切换。
综上所述,java的多线程模型是M:N的关系
除此之外还有1:1和M:1,有兴趣可以参考用户态线程和内核态线程有什么区别