跳至主要內容
JDK 虚拟线程完全指南:原理、使用与常见问题

前言

JDK 21 正式将虚拟线程(Virtual Threads)作为一项特性发布,彻底改变了 Java 并发编程的格局。传统平台线程在面对高并发 I/O 密集型场景时,线程数受限于操作系统资源,开发者不得不借助异步编程或响应式框架来突破瓶颈。虚拟线程的出现让"每个请求一个线程"的简洁模型重新焕发生机——但用不对也会踩坑。

本文将系统梳理虚拟线程的原理、与平台线程的区别、正确使用方式以及常见问题。


1. 什么是虚拟线程

虚拟线程是由 JDK 而非操作系统管理的轻量级线程。它的工作原理可以概括为:

  1. 虚拟线程是用户态线程:由 JVM 调度,不直接映射到操作系统线程
  2. 载体线程(Carrier Thread):虚拟线程需要挂载到一个平台线程上才能执行
  3. 自动挂起/恢复:当虚拟线程遇到阻塞 I/O 操作时,JVM 自动将其从载体线程上卸载,载体线程可以去执行其他虚拟线程;I/O 完成后再恢复执行

郑天祺大约 10 分钟java基础Java虚拟线程并发编程
Java LTS 版本新特性实战与面试指南(JDK 8 / 11 / 17 / 21)

Java LTS 版本新特性实战与面试指南(JDK 8 / 11 / 17 / 21)

👨‍💻 适用人群:Java 开发者 | 面试求职者


一、Java LTS 版本演进概览

1.1 四大 LTS 版本时间线

版本 发布年份 维护期 市场定位
JDK 8 2014 → 2030年12月 经典老将,存量系统首选
JDK 11 2018 → 2026年9月 Java 11是新特性分水岭
JDK 17 2021 → 2029年9月 当前主流,生产环境推荐
JDK 21 2023 → 2032年9月 最新 LTS,功能最全

郑天祺大约 7 分钟java基础JDK新特性面试
interrupt方法对线程的影响

在Java中,interrupt() 方法是 Thread 类中的一个实例方法,用于中断线程。它并不直接终止线程的执行,而是设置线程的中断状态(即把该线程的中断标志设为 true)。线程可以定期检查这个中断状态,以判断是否应该提前退出或改变行为。以下是 interrupt() 方法对线程的影响:

1. 中断状态

  • 当调用 thread.interrupt() 时,如果线程正在运行,那么它的中断状态将被设置为 true。线程可以通过 Thread.currentThread().isInterrupted() 来检查自身的中断状态。
  • 如果线程已经处于中断状态,则再次调用 interrupt() 不会有额外的效果。

郑天祺大约 3 分钟java基础java并发编程线程
java线程池队列问题

问题:
Java线程池,5核心、10最大、20队列,第6个任务来了是什么状态?第26个任务来了是什么状态?队列满了以后执行队列的任务是从队列头 or 队尾取?
核心线程和非核心线程执行结束后,谁先执行队列里的任务?

在Java中,线程池的配置和行为由ThreadPoolExecutor类控制。根据你提供的参数,假设你创建了一个具有以下配置的线程池:

  • 核心线程数(corePoolSize):5
  • 最大线程数(maximumPoolSize):10
  • 任务队列容量(queue capacity):20

郑天祺大约 4 分钟java基础线程池java基础
Future使用:runnable和callable方法区别

所谓异步调用其实就是实现一个可无需等待被调用函数的返回值而让操作继续运行的方法。
在 Java 语言中,简单的讲就是另启一个线程来完成调用中的部分计算,使调用继续运行或返回,而不需要等待计算结果。但调用者仍需要取线程的计算结果。

一、 Future 是什么

作用

future 可以用于异步获取多线程任务结果 , Callable 用于产生结果,Future 用于获取结果

流程

当 Future 进行 submit 开始 , 业务处理已经在多线程中开始 , 而 Get 即从多线程中获取数据
当 Get 获取时业务还未处理完 , 当前线程会阻塞 , 直到业务处理完成 . 所以需要注意 future 的任务安排
使用 future 会有以下效果:


郑天祺大约 7 分钟java基础java基础多线程异步编程
BigDecimal

1、介绍

Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数,但在实际应用中,可能需要对更大或者更小的数进行运算和处理。
一般情况下,对于那些不需要准确计算精度的数字,我们可以直接使用Float和Double处理,但是Double.valueOf(String) 和Float.valueOf(String)会丢失精度。所以开发中,如果我们需要精确计算的结果,则必须使用BigDecimal类来操作。
BigDecimal所创建的是对象,故我们不能使用传统的+、-、*、/等算术运算符直接对其对象进行数学运算,而必须调用其相对应的方法。方法中的参数也必须是BigDecimal的对象。构造器是类的特殊方法,专门用来创建对象,特别是带有参数的对象。


郑天祺大约 5 分钟java基础java基础BigDecimal
java操作txt文件总结

1、介绍

(1)Java.io包

File类

这是Java中一个内置的包,专门用于文件读写的一个操作的类
在程序中使用 文件或者流的操作就要导入import java.io.*;

File类可以表示一个文件,还可以表示一个目录(Directory),所以我们可以在程序中用File 类的对象可以表示一个文件 或者 目录
当创建了 File 对象之后,我们可以利用该对象来对文件或者目录进行书属性修改:例如:文件的名称,修改日期的日期等等
File 类的对象 还不能直接对文件进行读写操作,只能修改文件的属性


郑天祺大约 6 分钟java基础Java基础文件操作IO流
Netty介绍及简单示例

一、介绍

简介

netty是一个异步、基于事件驱动的网络应用框架,用以快速开发高性能、高可用的网络IO程序
netty主要针对在TCP协议下,面向Clients端的高并发应用,或者peer-to-peer场景下的大量数据持续性传输的应用
netty本质是一个NIO框架,适用于服务器通讯相关的多种场景。
Netty是一个提供异步事件驱动的网络应用框架,用以快速开发高性能、高可靠性的网络服务器和客户端程序。
Netty是一个NIO框架,使用它可以简单快速地开发网络应用程序,比如客户端和服务端的协议。Netty大大简化了网络程序的开发过程比如TCP和UDP的 Socket的开发。


郑天祺大约 5 分钟java基础NettyNIO网络框架
JDK并发包常用类

1、工具类

提供并发控制手段: CountDownLatch、CyclicBarrier、Semaphore

线程间数据交换: Exchanger

CountDownLatch:

允许一个或多个线程等待其他线程完成操作。

CountDownLatch的构造函数接受一个int类型的参数作为计数器,你想等待n个点完成,就传入n。

两个重要的方法:

countDown():调用时,n会减1。

await():调用会阻塞当前线程,直到n变成0。

await(long time,TimeUnit unit):等待特定时间后,就不会继续阻塞当前线程。


郑天祺大约 3 分钟java基础java基础并发编程JDK
CountDownLatch

1、CountDownLatch简介

	CountDownLatch是一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待,直到其他线程执行完后再执行。

	类似的任务可以使用线程的  join()  方法实现:在等待时间点调用其他线程的  join()  方法,当前线程就会等待join线程执行完之后才继续执行,但 CountDownLatch 实现更加简单,并且比 join 的功能更多。

CountDownLatch函数列表

CountDownLatch(int count)
构造一个用给定计数初始化的 CountDownLatch// 使当前线程在锁存器倒计数至零之前一直等待,除非线程被中断。
void await()
// 使当前线程在锁存器倒计数至零之前一直等待,除非线程被中断或超出了指定的等待时间。
boolean await(long timeout, TimeUnit unit)
// 递减锁存器的计数,如果计数到达零,则释放所有等待的线程。
void countDown()
// 返回当前计数。
long getCount()
// 返回标识此锁存器及其状态的字符串。
String toString()

郑天祺大约 3 分钟java基础并发编程同步工具CountDownLatch
2
3
4