最近Java热门项目Loom进展很好,尝试本地运行下新功能,分享遇到的一些问题。
IntelliJ IDEA使用的版本是:2021.3.2 (Ultimate Edition),Build #IU-213.6777.52, built on January 28, 2022。看着还挺新的,可惜还不够最新,后文会提到。
首先按照如下步骤安装JDK 19最新的预览版本。关于Loom的更多信息:Loom Early-Access Builds
下载JDK 19预览版,以Mac为例:
https://download.java.net/java/early_access/jdk19/28/GPL/openjdk-19-ea+28_macos-x64_bin.tar.gz
下载完解压到相应位置,进入目录/Applications/jdk-19.jdk/Contents/Home/bin
执行如下命令:
tech@mymac bin % ./java --version
openjdk 19-ea 2022-09-20
OpenJDK Runtime Environment (build 19-ea+28-2110)
OpenJDK 64-Bit Server VM (build 19-ea+28-2110, mixed mode, sharing)
JDK 19安装没问题,接下来集成到Idea中,新建jdk_19项目。
1.配置项目SDK
添加刚安装的JDK成为Idea的SDK
完成后选择这个SDK,Language level选择“X-Experimental”
Modules中依赖SDK也需要配置
写一个简单的测试代码试验下:
package com.echx.jdk19;
public class TestLoom {
public static void main(String[] args) throws InterruptedException {
System.out.println("Current jdk version:"+System.getProperty("java.version") );
System.out.println("1-Run in main thread, Currrent ThreadName:"+Thread.currentThread().getName());
Thread thread1 = Thread.ofVirtual().start(new Runnable() {
@Override
public void run() {
System.out.println("Run in virtual thread, Currrent ThreadName:"+Thread.currentThread());
}
});
System.out.println("2-Run in main thread, Currrent ThreadName:"+Thread.currentThread().getName());
thread1.join();
Thread thread = new Thread(new Runnable(){
@Override
public void run() {
System.out.println("Run in classic thread, Currrent ThreadName:"+Thread.currentThread().getName());
}
});
thread.start();
thread.join();
}
}
测试代码做的事情:起了一个Virtual Thread,打印当前线程信息,与普通线程做个对比。
开始build,很不幸出现以下错误:
java: ofVirtual() 是预览 API,默认情况下处于禁用状态。
(请使用 --enable-preview 以启用预览 API)
配置--enable-preview到编译环境
再次不幸,出了以下错误提示:
java: 源发行版 18 与 --enable-preview 一起使用时无效
(仅发行版 19 支持预览语言功能)
而这个错误最终导致了放弃在Idea中测试JDK 19的预览功能。
经过漫长的网上漫游寻找解决方案,多种配置方式都无法解决这个错误,最终据说是只能更新到最新版Idea,在Compiler配置如下参数:-enable-preview --source 19
切换到命令行,直接编译运行了。
进入到该项目的src目录下。
/Applications/jdk-19.jdk/Contents/Home/bin
是JDK 19-EA安装目录。
编译:
/Applications/jdk-19.jdk/Contents/Home/bin/javac --release 19 --enable-preview -Xlint:preview com/echx/jdk19/TestLoom.java
注意加上参数:--release 19 --enable-preview
有一个警告提示,可以忽略:
com/echx/jdk19/TestLoom.java:8: 警告: [preview] ofVirtual() 是预览 API,可能会在未来发行版中删除。 Thread thread1 = Thread.ofVirtual().start(new Runnable() { ^ 1 个警告
运行:
/Applications/jdk-19.jdk/Contents/Home/bin/java --enable-preview com.echx.jdk19.TestLoom
得到如下输出:
Current jdk version:19-ea
1-Run in main thread, Currrent ThreadName:main
2-Run in main thread, Currrent ThreadName:main
Run in virtual thread, Currrent ThreadName:VirtualThread[#21]/runnable@ForkJoinPool-1-worker-1
Run in classic thread, Currrent ThreadName:Thread-0
成功!可以看到Virtual Thread是在ForkJoinPool的一个实际线程中运行。