ScheduledExecutorService在执行虚拟线程之前退出



在尝试使用java 19虚拟线程进行实验时,我遇到了一个不寻常的行为,下面的代码与平台线程完美配合。但当我切换到虚拟线程时,它突然退出。添加时(真正的);最后解决了问题,程序继续打印&;hello&;。是否可以使用虚拟线程ScheduledExecutorService?

ThreadFactory factory = Thread.ofVirtual().factory();
ScheduledExecutorService scheduledExecutorService = Executors.newSingleThreadScheduledExecutor(factory);
scheduledExecutorService.scheduleAtFixedRate(() -> {
System.out.println("hello");
}, 0, 5000, TimeUnit.MILLISECONDS);
}
//while(true);

来自文档:

虚拟线程是守护线程,所以不会阻止Java虚拟机的终止。

这看起来是绝对的;没有办法使虚拟线程非守护进程

因此,如果您想使用一个使用虚拟线程的线程池(无论是否已调度),那么您需要确保至少有一个非守护进程平台线程在您需要的时间内保持活动状态。你的while (true);循环目前做到了这一点,但在某种程度上我强烈反对;甚至睡线会更好,虽然仍然不是很好。在更复杂的应用程序中,如服务器或桌面应用程序,您可能会有一个或多个非守护进程线程在工作(例如,"事件循环");(在桌面应用程序中),使JVM保持活动。

最新更新