Java 无法使用Project Loom创建虚拟线程
我在探索ProjectLoom中的虚拟线程。文件中简单的代码行如下所示:Java 无法使用Project Loom创建虚拟线程,java,multithreading,green-threads,Java,Multithreading,Green Threads,我在探索ProjectLoom中的虚拟线程。文件中简单的代码行如下所示: Thread.startVirtualThread(() -> { System.out.println("Hello, Loom!"); }); 或 我试过这两种方法,第一种,我收到一个错误 类型线程的方法startVirtualThread(()->{})未定义 第二个呢 -类型线程的方法builder()未定义 一次浏览,发现lombok是必需的,也安装了lombok。然而,它并没
Thread.startVirtualThread(() -> {
System.out.println("Hello, Loom!");
});
或
我试过这两种方法,第一种,我收到一个错误
类型线程的方法startVirtualThread(()->{})
未定义
第二个呢
-类型线程的方法builder()
未定义
一次浏览,发现lombok是必需的,也安装了lombok。然而,它并没有出现在Eclipse关于部分中,我可以使用lombok,但我的问题仍然没有解决
下面的链接显示了我所指的文档
示例代码:
public class threads {
public void simpleThread() {
Thread start = Thread.builder().virtual().task(() -> {
System.out.println("Hello World");
}).start();
Thread.startVirtualThread(() -> {
System.out.println("Hello, Loom!");
});
}
public static void main(String[] args) {
// TODO Auto-generated method stub
threads trd = new threads();
trd.simpleThread();
}
}
调用与Loom相关的新线程方法时,Eclipse的旧版本似乎出现了编译错误 请尝试使用最新的Eclipse()和 通过直接从命令行编译和运行程序(使用
javac
和java
命令),可以确保这是一个与Eclipse相关的问题。对于ubuntu系统:
在.bashrc文件中设置java 16路径。确保文件中只存在java 16路径。如果提到任何其他java路径,那么下面的命令可能不起作用
如果要确认java版本是否设置为16,则执行java-version。
然后,您可以尝试通过以下命令直接编译loom类。
它对我很有用。即使当编译问题消失后,它也可能打印出任何内容 虚拟线程需要一个
载体
(要在其上执行的本机线程);如果本机线程完成得比虚拟线程早,那么就没有这样的载体;因此,你没有得到打印。有几种方法可以解决这个问题
最简单的方法(看看这是否有效)是让carrier
线程休眠一段时间:
Thread.startVirtualThread(() -> {
while (true) {
System.out.println("trying " + Thread.currentThread().getName());
}
});
LockSupport.parkNanos(TimeUnit.MILLISECONDS.toNanos(10));
在我的机器上,这为生成一些输出提供了足够的时间
另一种方式是在载体上加入:
Thread t = Thread.startVirtualThread(() -> {
System.out.println("trying " + Thread.currentThread().getName());
});
t.join();
这是为了演示,但在现实生活中,你可能需要一个执行者。一种供应方式是:
Thread.builder()
.virtual(Executors.newFixedThreadPool(1))
.task(() -> {
System.out.println("started");
})
.build()
.start();
System.out.println("done");
您甚至可以使用Executors::newVirtualThreadExecutor
,其中当前文档说明:
创建一个执行器,为每个任务启动一个新的虚拟线程
所以你能做的是:
ExecutorService service = Executors.newVirtualThreadExecutor();
service.execute(() -> {
System.out.println(Thread.currentThread().getId());
});
service.execute(() -> {
System.out.println(Thread.currentThread().getId());
});
LockSupport.parkNanos(TimeUnit.MILLISECONDS.toNanos(10));
您是否正在使用一个包含Loom的特殊Java构建?因为这在Java本身中还不存在,所以不需要lombok。正如@MarkRotteveel所提到的,请确保您使用的是@MarkRotteveel的构建,我已经尝试过使用OpenJDK 14、15、16以及带有loom的版本。请参阅:
Thread t = Thread.startVirtualThread(() -> {
System.out.println("trying " + Thread.currentThread().getName());
});
t.join();
Thread.builder()
.virtual(Executors.newFixedThreadPool(1))
.task(() -> {
System.out.println("started");
})
.build()
.start();
System.out.println("done");
ExecutorService service = Executors.newVirtualThreadExecutor();
service.execute(() -> {
System.out.println(Thread.currentThread().getId());
});
service.execute(() -> {
System.out.println(Thread.currentThread().getId());
});
LockSupport.parkNanos(TimeUnit.MILLISECONDS.toNanos(10));