首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法使用项目织机的虚拟线程

无法使用项目织机的虚拟线程
EN

Stack Overflow用户
提问于 2020-06-29 18:05:39
回答 3查看 723关注 0票数 2

我在探索织机中的虚拟线程。这些文档用简单的代码行表示它是直接的,如下所示:

代码语言:javascript
复制
Thread.startVirtualThread(() -> {
    System.out.println("Hello, Loom!");
});

代码语言:javascript
复制
Thread t = Thread.builder().virtual().task(() -> { ... }).start();

我尝试了这两种方法,对于第一种方法,我收到了一个错误,方法未定义为Thread类型

对于第二个- -方法未为Thread类型定义

一次浏览,发现lombok是必需的,还安装了lombok。然而,它没有出现在Eclipse中有关部分,我可以使用lombok,但我的问题仍然没有解决。

下面的链接显示了我所指的文档。

在这里输入链接描述

样本代码:

代码语言:javascript
复制
 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();
    }
}

EN

回答 3

Stack Overflow用户

发布于 2020-08-14 19:45:21

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

请尝试将最新的Eclipse (目前2020-09)与OpenJDK项目织机早期访问构建一起使用。

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

票数 0
EN

Stack Overflow用户

发布于 2020-09-20 12:13:05

对于ubuntu :在.bashrc文件中设置java 16路径。确保文件中只有java 16路径。如果提到任何其他java路径,则下面的命令可能无法工作。

如果要确认java版本是否设置为16,则执行java -version

然后,您可以尝试通过以下命令直接编译织机类。

代码语言:javascript
复制
javac className.java 

代码语言:javascript
复制
java className

对我起作用了。

票数 0
EN

Stack Overflow用户

发布于 2020-10-15 01:47:08

即使编译问题消失了,这可能也可能不会打印任何内容。

虚拟线程需要一个carrier (要在其上执行一个本机线程);如果本机线程提前完成,那么虚拟线程就开始了,就没有这样的载体了;因此您没有打印。有几种方法可以解决这个问题。

最简单的方法(只是为了证明这是可行的),就是让carrier线程睡眠一段时间:

代码语言:javascript
复制
 Thread.startVirtualThread(() -> {
        while (true) {
            System.out.println("trying " + Thread.currentThread().getName());
        }
    });

    LockSupport.parkNanos(TimeUnit.MILLISECONDS.toNanos(10));

在我的机器上,这给了足够的时间来生成一些输出。

另一种方式是加入carrier

代码语言:javascript
复制
    Thread t = Thread.startVirtualThread(() -> {
         System.out.println("trying " + Thread.currentThread().getName());
    });

    t.join();

这是为了演示的目的,但在现实生活中,你可能需要一个执行者。提供这种服务的一种方式是:

代码语言:javascript
复制
   Thread.builder()
          .virtual(Executors.newFixedThreadPool(1))
          .task(() -> {
              System.out.println("started");
          })
          .build()
          .start();

    System.out.println("done");

在当前文档声明如下的地方,甚至可以使用Executors::newVirtualThreadExecutor

为每个任务创建一个启动新虚拟线程的执行器。

所以你能做的是:

代码语言:javascript
复制
    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));
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62644164

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档