在我的Java应用程序中,我定义了一个这样的ScheduleService:
ScheduledService<Void> scheduledService = new ScheduledService<Void>() {
@Override
protected Task<Void> createTask() {
return new Task<Void>() {
@Override
protected Void call() {
tick();
return null;
}
};
}
};
scheduledService.setPeriod(new javafx.util.Duration(TICK_PERIOD.toMillis()));
scheduledService.start();
当我从IntelliJ触发应用程序时,它工作正常,tick()每秒运行一次。使用JavaFX Packager将应用程序打包为.exe
时,该服务永远不会启动。
在所有情况下运行.start()
后服务器的状态为SCHEDULED
。还有什么想法可能会发生什么?有什么东西可以防止创建线程吗?或者它可能没有在各种线程之间切换?
ScheduledService
的文档说(强调我的):
这门课程的时间并不绝对可靠。 非常繁忙的事件线程可能会在后台任务执行开始时引入一些时间延迟,因此周期或延迟的非常小的值可能不准确。数百毫秒或更长的延迟或周期应该相当可靠。
事件线程是否存在某些问题?有没有办法检查它?
致电start()
后,scheduleService.getExecutor()
会返回null
。这是预期的吗?
我尝试以这种方式设置我自己的执行器:
BlockingQueue<Runnable> blockingQueue = new LinkedBlockingQueue<>();
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(32, Integer.MAX_VALUE, 1000, TimeUnit.MILLISECONDS, blockingQueue);
scheduledService.setExecutor(threadPoolExecutor);
然后我在调用start之前和之后打印出来。在它看起来像这样之前:
java.util.concurrent.ThreadPoolExecutor@4d97d155[Running, pool size = 0, active threads = 0, queued tasks = 0, completed tasks = 0]
之后:
java.util.concurrent.ThreadPoolExecutor@4d97d155[Running, pool size = 1, active threads = 1, queued tasks = 0, completed tasks = 0]
所以,它声称这里有一个活跃的主题,即使它似乎根本不活跃。
更新:我删除了屏幕保护程序的提及,因为我设法将问题重现为一个简单的.exe
,但我仍然遇到问题,即当问题不会发生时从IntelliJ运行它,只有在打包为.exe
时才会发生。
答案 0 :(得分:1)
我找到了解决方案,它与ScheduleService
无关。我的应用程序中确实存在三个其他错误,这些错误正在复合以产生意外行为,并隐藏我尝试探索问题。