Java中的时间轴和线程有什么区别

 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.

Java中的时间轴和线程有什么区别

实现相同的功能

推荐答案

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更新(例如,在”内存”游戏中显示和隐藏图像).

因此:

  • KeyFrame附加到Timeline的事件处理程序中的代码可能会更新UI,因为保证它可以在FX应用程序线程上执行
  • KeyValue在Timeline中作为A KeyFrame的一部分进行更新的KeyValue可能是屏幕上显示的UI元素的属性
  • KeyFrame s的事件处理程序中的代码不得阻止执行或执行长期运行的任务
  • 尝试在非JAVAFX应用程序中使用Timeline(即尚未启动JavaFX运行时的一个)将失败,因为将没有Javafx应用程序线程来执行更新.

相反:

  • 代码在背景上运行Thread 不得 更新UI元素(或其属性).这是Javafx和Java Swing/awt
  • 的确如此

  • 在背景线程上运行的代码可能会阻止或执行长期运行的任务

请注意,java.util.Timer及其关联TimerTask(是标准Java API的一部分)在由Timer内部​​创建的背景线程上执行.这意味着,尽管Timer和TimerTask的API看起来与Timeline有些相似,但它们必须遵守背景线程的规则(不得更新UI等).

其他推荐答案

为了理解差异,您需要考虑两个主要问题:

  • 当我们使用单独的Thread时,我们可以从同一线程更新Javafx UI控件吗?
  • 给定WritableValue,我们如何通过预先指定的速率,开始值和最终值来使Thread随时间更改该值?

来自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线程.

  • 最后一部分并不是A Timeline设计的目的.如果您必须更改持续时间,则需要重新初始化Timeline或删除旧KeyFrame并在新持续时间内添加新的.

以上所述是小编给大家介绍的Java中的时间轴和线程有什么区别,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对77isp云服务器技术网的支持!

原文链接:https://77isp.com/post/34136.html

=========================================

https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。