当前位置: 首页 > 知识库问答 >
问题:

java - 为什么虚拟线程无法在虚拟线程池中执行?

钱朝明
2023-10-17

环境: java21
问题: methods5不会输出log.info的内容, methods6正常打印log.info的内容

    private static void methods5() {        ThreadFactory tf = Thread.ofVirtual().factory();        try (ExecutorService executor = Executors.newVirtualThreadPerTaskExecutor()) {            Thread vt = tf.newThread(() -> log.info("vt task executed."));            for (int i = 0; i < 5; i++) {                executor.submit(vt).get();            }        } catch (ExecutionException | InterruptedException e) {            throw new RuntimeException(e);        }    }    private static void methods6() {        try (ExecutorService executor = Executors.newFixedThreadPool(5)) {            Thread thread = new Thread(() -> log.info("thread task executed."));            for (int i = 0; i < 5; i++) {                try {                    executor.submit(thread).get();                } catch (InterruptedException | ExecutionException e) {                    // 处理异常                }            }        }    }

共有1个答案

吕文林
2023-10-17

正确的做法是给调度器传真正的线程对象,它会以虚拟线程形式运行,而不是给它传虚拟线程,要么你就干脆直接对虚拟线程使用start()方法
改法一:

private static void methods5() {  try (ExecutorService executor = Executors.newVirtualThreadPerTaskExecutor()) {      Thread vt = new Thread(() -> System.out.println("vt task executed."));      for (int i = 0; i < 5; i++) {          executor.submit(vt).get();      }  } catch (ExecutionException | InterruptedException e) {      throw new RuntimeException(e);  }  }

改法二:

private static void methods5() {  try (ExecutorService executor = Executors.newVirtualThreadPerTaskExecutor()) {      for (int i = 0; i < 5; i++) {          executor.submit(()->{              System.out.println("vt task executed.");          });      }  }}

另外虚拟线程没有必要使用池化技术,因为创建和销毁的代价非常小,池化的话属于是违背初心了

 类似资料:
  • java 都有虚拟线程了,那多线程在加虚拟线程并行岂不无敌

  • 问题内容: 我有一个处理来自.NET Remoting的异步回调的Python脚本。这些回调在虚拟(工作)线程中执行。从我的回调处理程序内部,我需要调用在脚本中定义的函数,但需要在主线程中执行该函数。 主线程是将命令发送到服务器的远程客户端。其中一些命令会导致异步回调。 基本上,我需要等效于.NET的Invoke方法。这可能吗? 问题答案: 您想使用Queue(现在是python 3的队列)类来设

  • 我对虚拟函数感到困惑。有人告诉我,父类中的虚拟意味着我可以在子类中覆盖它。但是,如果我省略父类中的虚拟,我仍然可以覆盖它。

  • 问题内容: 在继承中虚拟函数如何在后台工作?编译器是否特别对待虚拟函数? 问题答案: 是的,编译器和运行时对虚拟方法的处理方式有所不同。JVM专门利用虚拟方法表进行虚拟方法分配: 对象的调度表将包含对象的动态绑定方法的地址。通过从对象的分派表中获取方法的地址来执行方法调用。属于同一类的所有对象的分发表都是相同的,因此通常在它们之间共享。属于类型兼容类的对象(例如,继承层次结构中的同级对象)将具有具

  • 简单地说,虚拟机(Virtual Machine)就是允许我们在当前操作系统中运行其他操作系统的软件,本质上和 VS、QQ 这些应用程序一样。 所以,只要我们在电脑(PC 或笔记本等)上安装好虚拟机软件,就可以模拟出来若干台相互独立的虚拟 PC 设备,每一个都如何一台真实的计算机。在此基础上,我们可以给每台虚拟的 PC 设备安装指定的操作系统,这样就可以实现在一台电脑上同时运行多个操作系统。 另外

  • 本文向大家介绍什么是虚拟DOM?相关面试题,主要包含被问及什么是虚拟DOM?时的应答技巧和注意事项,需要的朋友参考一下 虚拟 dom 是相对于浏览器所渲染出来的真实 dom 的,在react,vue等技术出现之前,我们要改变页面展示的内容只能通过遍历查询 dom 树的方式找到需要修改的 dom 然后修改样式行为或者结构,来达到更新 ui 的目的。 这种方式相当消耗计算资源,因为每次查询 dom 几