Java 无法使用Project Loom创建虚拟线程

Java 无法使用Project Loom创建虚拟线程,java,multithreading,green-threads,Java,Multithreading,Green Threads,我在探索ProjectLoom中的虚拟线程。文件中简单的代码行如下所示: Thread.startVirtualThread(() -> { System.out.println("Hello, Loom!"); }); 或 我试过这两种方法,第一种,我收到一个错误 类型线程的方法startVirtualThread(()->{})未定义 第二个呢 -类型线程的方法builder()未定义 一次浏览,发现lombok是必需的,也安装了lombok。然而,它并没

我在探索ProjectLoom中的虚拟线程。文件中简单的代码行如下所示:

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));