我在探索织机中的虚拟线程。这些文档用简单的代码行表示它是直接的,如下所示:
Thread.startVirtualThread(() -> {
System.out.println("Hello, Loom!");
});或
Thread t = Thread.builder().virtual().task(() -> { ... }).start();我尝试了这两种方法,对于第一种方法,我收到了一个错误,方法未定义为Thread类型
对于第二个- -方法未为Thread类型定义
一次浏览,发现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();
}
}

发布于 2020-08-14 19:45:21
看起来,在调用与Loom相关的新线程方法时,Eclipse的旧版本出现了编译错误。
请尝试将最新的Eclipse (目前2020-09)与OpenJDK项目织机早期访问构建一起使用。
通过直接从命令行编译和运行程序(使用javac和java命令),可以确保这是与Eclipse相关的问题。
发布于 2020-09-20 12:13:05
对于ubuntu :在.bashrc文件中设置java 16路径。确保文件中只有java 16路径。如果提到任何其他java路径,则下面的命令可能无法工作。
如果要确认java版本是否设置为16,则执行java -version。
然后,您可以尝试通过以下命令直接编译织机类。
javac className.java
java className
对我起作用了。
发布于 2020-10-15 01:47:08
即使编译问题消失了,这可能也可能不会打印任何内容。
虚拟线程需要一个carrier (要在其上执行一个本机线程);如果本机线程提前完成,那么虚拟线程就开始了,就没有这样的载体了;因此您没有打印。有几种方法可以解决这个问题。
最简单的方法(只是为了证明这是可行的),就是让carrier线程睡眠一段时间:
Thread.startVirtualThread(() -> {
while (true) {
System.out.println("trying " + Thread.currentThread().getName());
}
});
LockSupport.parkNanos(TimeUnit.MILLISECONDS.toNanos(10));在我的机器上,这给了足够的时间来生成一些输出。
另一种方式是加入carrier
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));https://stackoverflow.com/questions/62644164
复制相似问题