别坚持Java 8了
业界长期坚持用Java 8,不久之前我也是这么坚持的。
但在用了JDK21之后,发现是真香啊。
只是要从老项目的Java 8升级到JDK21难如登天。
也只能一步一步来。
比如先从Java 8升级到JDK 11或者JDK 17。
如果非Web项目,项目不大的话,升级难度还能接受。
如果是Web项目且关联众多,那还是坚持Java 8吧。
只是在开始新项目的时候,可以考虑一下JDK21。
毕竟作为LTS版本,在BUG修复,新特性方面还是很有吸引力。
加之现在Spring Boot 3最低支持JDK17,升级到JDK21也就顺手的事,何乐而不为呢。
下面聊一下JDK21主要更新了哪些内容。
主要更新内容
其中影响最大的是虚拟线程的GA,下面会简述一下虚拟线程的好处和给个🌰。
来个🌰
虚拟线程可以理解为,JVM申请了很多平台线程(数量有限,极其昂贵),然后在平台线程之上增加了一层,这一层也就是虚拟线程。
简单来说,比如JVM申请了5个盒子,计算机能分配给JVM的就只有这5个盒子。
有了5个盒子之后,我们可以往这5个盒子里面装无数个小盒子。
这些小盒子很轻量,不需要池化,用完就丢。
最主要调度过程,我们不用管。
JVM使用了FJ框架帮我们调度虚拟线程,处理虚拟线程的执行,调度,终止等等。
创建虚拟线程:
// 随便来个
Runnable runnable = () -> System.out.println(Thread.currentThread().threadId());
// 虚拟线程
Thread virtual = Thread.ofVirtual().name("czdm").unstarted(runnable);
virtual.start();
// 平台线程
Thread test = Thread.ofPlatform().name("czdm").unstarted(runnable);
test.start();
快速创建并启动:
Runnable runnable = () -> System.out.println(Thread.currentThread().threadId());
Thread thread = Thread.startVirtualThread(runnable);
判断当前线程是否为虚拟线程:
Thread.isVirtual();
平时用虚拟线程,我一般喜欢这么写,把虚拟线程的任务装到一个队列里面。
一起执行:
var threads = IntStream.range(0, 100).mapToObj(index -> Thread.ofVirtual().unstarted(() -> {
System.out.println(Thread.currentThread());
try {
Thread.sleep(5);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
System.out.println(Thread.currentThread());
})).toList();
threads.forEach(Thread::start);
for (Thread thread : threads) {
thread.join();
}
如果你使用的是Spring Boot 3.2以上版本,这样配置,可以很方便的在Spring Boot中启用虚拟线程:
spring:
threads:
virtual:
enabled: true
这不去试试?