2

我正在探索 Project Loom 中的虚拟线程。文档用以下简单的代码行直截了当地说:

Thread.startVirtualThread(() -> {
    System.out.println("Hello, Loom!");
});

或者

Thread t = Thread.builder().virtual().task(() -> { ... }).start();

我已经尝试了它们,对于第一个,我收到一个错误 The method startVirtualThread(() -> {})is undefined for type Thread

而对于第二个 -builder()线程类型的方法未定义

一浏览,发现需要lombok,也安装了lombok。但是它没有出现在 Eclipse About 部分,我可以使用 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();
    }
}

在此处输入图像描述

4

3 回答 3

0

看起来旧版本的 Eclipse 在调用与 Loom 相关的新 Thread 方法时出现编译错误。

请尝试将最新的 Eclipse(当前 2020-09)与OpenJDK Project Loom Early-Access Build一起使用。

您可以通过直接从命令行(使用javacjava命令)编译和运行程序来确保这是与 Eclipse 相关的问题。

于 2020-08-14T19:45:21.620 回答
0

对于 ubuntu 系统:在 .bashrc 文件中设置 java 16 路径。确保文件中只存在 java 16 路径。如果提到任何其他 java 路径,则以下命令可能不起作用。

如果要确认 java 版本是否设置为 16,请执行 java -version
然后您可以尝试通过以下命令直接编译您的织机类。

javac className.java 

java className

它对我有用。

于 2020-09-20T12:13:05.000 回答
0

即使您解决了编译问题,这也可能会或可能不会打印任何内容。

一个虚拟线程需要一个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当前文档所述的位置:

创建一个 Executor,为每个任务启动一个新的虚拟线程

所以你可以做的是:

    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));
于 2020-10-15T01:47:08.530 回答