2023-02-17 400
以下两个简单的摘要执行相同的操作,每秒打印”Hello, world”.但是它们有什么区别?我什么时候应该使用线程,什么时候应该使用时间轴.时间轴会在内部启动线程吗?如果不是这样,则如何在不阻止主线程的情况下每秒执行打印?
Timeline timeline = new Timeline(new KeyFrame(Duration.seconds(1), e -> System.out.println("Hello, world")));
timeline.setCycleCount(-1);
timeline.play();
new Thread(() -> {
while (true) {
System.out.println("Hello, world!");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
,在第二个摘要中,如果我做Thread.sleep(some_volatile_variable_of_main_thread_that_changes_overtime),我如何使用Timeline.
实现相同的功能
Thread类是标准Java API的一部分,代表背景线程.启动Thread时,其Runnable’s run方法或其自己的run方法中的代码基本上与其他运行线程并行执行.这允许代码可能需要很长时间才能执行执行,而无需延迟可以”同时”运行的其他代码.使用此操作的程序员的成本是,如果不同线程之间共享数据,则必须格外小心实际上在其他线程中观察到一个线程中的数据.
相比之下,
Timeline是Javafx框架的一部分,尤其是其动画API的一部分.启动Javafx应用程序时,一个称为FX应用程序线程的线程开始运行.该线程以循环运行,负责渲染UI和处理用户事件(除其他事项外). UI渲染发生在”脉冲”上,该脉冲(在当前版本中)目标是每秒60次.由于数据同步问题所提到的上述问题,因此在FX应用程序线程上进行了UI 的所有更改.此外,FX应用程序线程上的代码不得长期运行(因此不能使用sleep()暂停,也不能在io上读取大型数据集),因为它会阻止线程呈现UI.
a Timeline通过拥有一组KeyFrame s的工作,每个KeyFrame s指定时间(以Duration的形式,自时间轴启动以来测量)和事件处理程序和/或a .在FX应用程序线程的每个脉冲上,如果A Timeline正在运行,则FX应用程序线程循环将检查是否是时候触发任何事件处理程序了.对于KeyValue s,如果该值是可插值的(例如数字或实现Interpolatable,则将通过计算以下时间的时间来计算下一个KeyFrame
的时间的比例.
.
Timeline s对于简单的动画很有用(例如,通过使用指定其布局位置或翻译坐标或类似的KeyValue s,将节点跨窗格移动,也可以执行离散集在特定时间的UI更新(例如,在”内存”游戏中显示和隐藏图像).
因此:
相反:
的确如此
请注意,java.util.Timer及其关联TimerTask(是标准Java API的一部分)在由Timer内部创建的背景线程上执行.这意味着,尽管Timer和TimerTask的API看起来与Timeline有些相似,但它们必须遵守背景线程的规则(不得更新UI等).
为了理解差异,您需要考虑两个主要问题:
来自Timeline文档:
可以使用时间表来定义任何的免费表单动画
WritableValue,例如所有Javafx属性.一个时间表,由一个定义
或更多关键帧,在
keyframe.time指定的订单.动画属性,定义为
keyframe.values中的键值被插入/从目标
关键帧的指定时间到达时间轴的初始时间线的键值
位置,取决于时间轴的方向.
示例:弹跳14次(每次弹跳需要3秒)
Timeline timeline = new Timeline(new KeyFrame(Duration.seconds(3),
new KeyValue(ball.layoutXProperty(), parentPane.getBoundsInLocal().getMaxX() - ball.getRadius())));
timeline.setCycleCount(14);
timeline.play();
总而言之,Timeline是通过在Javafx线中顺序处理一个或多个KeyFrame来支持Animation的.
Timeline应以速率以动画和更新可写的UI值.另一方面,Thread应使用长期的背景任务(ExecutorService始终是一个更好的主意).
no,Timeline不启动新线程,它使用Javafx线程.
以上所述是小编给大家介绍的Java中的时间轴和线程有什么区别,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对77isp云服务器技术网的支持!
原文链接:https://77isp.com/post/34136.html
=========================================
https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。
数据库技术 2022-03-28
网站技术 2022-11-26
网站技术 2023-01-07
网站技术 2022-11-17
Windows相关 2022-02-23
网站技术 2023-01-14
Windows相关 2022-02-16
Windows相关 2022-02-16
Linux相关 2022-02-27
数据库技术 2022-02-20
抠敌 2023年10月23日
嚼餐 2023年10月23日
男忌 2023年10月22日
瓮仆 2023年10月22日
簿偌 2023年10月22日
扫码二维码
获取最新动态