本文主要整理Java操作线程、协程方式
概念:进程、线程、协程
-
进程(Process) —— 程序,是系统分配资源的单位
- 范围: 一个系统,多个进程
- 查看: 可通过
ps -ef查看进程列表 - JDK: 通过
java -jar xxx.jar启动的JVM就是一个进程,可通过jps -mlvV查看
-
线程(Thread)/内核线程(Kernel-Level Thread,KLT) —— 线程,是CPU核心调度的最小单位(一个CPU物理核心只能同时运行一个线程),在程序中共享进程资源,系统提供接口
- 特点: 直接由操作系统内核(Kernel)支持的线程。这种线程由操作系统内核来完成线程切换,操作系统内核通过操纵调度器(Scheduler)对线程进行调度,并负责将线程的任务映射到各个处理器上。
- 范围: 一个进程,多个线程
- JDK: 提供JUC(java.util.concurrent)接口 (JDK的线程接口实现参考openjdk代码:Thread.c/jvm.cpp/thread.cpp/os_linux.cpp)
- 限制: 通过
sysctl kernel.threads-max;cat /proc/sys/kernel/threads-max可查看一个进程可以启动的最大线程数量。可以通过sysctl -w kernel.threads-max=102400;sysctl -p修改。 (当实际线程数量超过上述设置值后,Java 继续创建线程会报错:Exception in thread "main" java.lang.OutOfMemoryError: unable to create new native thread)
提示
如果要为应用估计工作线程数,可参考如下公式:
- 计算密集型:
线程数 = CPU个数 + 1 - IO密集型:
线程数 = CPU个数 * 2 + 1(还需考虑:吞吐量(tps))
-
协程(Coroutines)/用户线程(User Thread,UT) —— 程序中让出线程控制权的线程管理方式,不依赖系统接口,一般由开发语言提供接口或开发者自行实现
- 特点: 由程序在内存中管理,创建和销毁的开销相对小,相对相对内核线程更高效
- 范围: 一个线程,多个协程代码
- JDK:
- 在Java 1.2之前,实现Thread接口的是其内部实现的用户线程,由于存在问题之后的版本回归系统的内核线程。
- 在Java 19中实装虚拟线程(Visual Thread)特性,该特性提供了协程接口。
(相比其他语言通过新增
yield语句来控制让出线程控制权,虚拟线程提供的接口和JDK线程接口类似,便于开发者适应)
2024年5月24日大约 31 分钟