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

2024-02-15

以下两个简单的片段执行相同的操作,打印"Hello, world"每一秒。但它们之间有什么区别呢?什么时候应该使用线程,什么时候应该使用时间轴。 Timeline 内部是否启动一个线程?如果没有,如何在不阻塞主线程的情况下每秒执行一次打印?

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.


The Thread类是标准 Java API 的一部分,代表后台线程。当一个Thread启动后,其代码Runnable's run方法,或者它自己的方法run方法,基本上与其他正在运行的线程并行执行。这允许可能需要很长时间才能运行的代码得以执行,而不会延迟可以“同时”运行的其他代码。使用此功能的程序员的代价是,如果数据在不同线程之间共享,则必须非常小心,以确保在任何单个线程中以一致的状态读取数据,并且数据是“活动的”:也就是说,数据会发生变化实际上,在一个线程中对数据所做的操作是在其他线程中观察到的。

相比之下,Timeline是 JavaFX 框架的一部分,特别是其动画 API 的一部分。当 JavaFX 应用程序启动时,称为 FX 应用程序线程的线程开始运行。该线程在循环中运行,负责渲染 UI 和处理用户事件(除其他外)。 UI 渲染发生在“脉冲”上,(在当前版本中)目标是每秒发生 60 次。由于上面提到的数据同步问题,对 UI 的所有更改must在 FX 应用程序线程上进行。此外,FX 应用程序线程上的代码不得长时间运行(因此它不能通过sleep(),或者通过 IO 读取大数据集),因为它会阻止线程渲染 UI。

A Timeline通过拥有一组来工作KeyFrames,每个指定一个时间(以Duration,自时间线开始以来测量)和事件处理程序和/或KeyValue。在 FX 应用程序线程的每个脉冲上,如果Timeline正在运行时,FX 应用程序线程循环将检查是否是时候触发任何事件处理程序。为了KeyValues,如果该值是可插值的(例如是数字,或者实现Interpolatable,它的值将通过计算经过的时间占下一个时间的比例来计算KeyFrame.

Timelines 对于简单的动画很有用(例如,通过在窗格中移动节点,通过使用KeyValue指定其布局位置或平移坐标或类似的),也用于在特定时间执行一组离散的 UI 更新(例如,在“记忆”游戏中显示和隐藏图像)。

最后:

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

反过来:

  • 代码在后台运行Thread must not更新 UI 元素(或其属性)。 JavaFX 和 Java Swing/AWT 都是如此
  • 在后台线程上运行的代码可能会阻塞或执行长时间运行的任务

请注意,java.util.Timer和它相关联TimerTask(这是标准 Java API 的一部分)在由内部创建的后台线程上执行Timer。这意味着,尽管 APITimer and TimerTask看起来有点类似于Timeline,它们必须遵守后台线程的规则(不得更新 UI 等)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java中时间轴和线程有什么区别 的相关文章

  • 在java代码中创建postgresql表

    我有一个与 postgreSQL 数据库连接的 java 代码 现在 我希望当它连接到数据库时 我还将创建数据库表 但我的问题是 它不会创建数据库 我不知道问题是什么 这是我的代码 Statement st null ResultSet r
  • Selector.close() 是否关闭所有客户端套接字?

    我是 nio 套接字的新手 我已经使用 nio 套接字编写了一个服务器 现在我正在尝试编写关闭钩子以确保通过清理资源正常退出 我的问题是Selector close 方法关闭所有客户端套接字 如果没有 请告诉我如何访问所有客户端套接字 而无
  • 如何重复一段文本中的每个字母?爪哇语

    就像在口吃中一样 如果文本为 dean 并且乘数为 3 则结果将是 dddeeeaaannn 由提供的乘数指定的次数 public static void repeatLetters String text dean int n 3 Str
  • Java 错误和警告列表

    在哪里 如何获得所有 java 和 javac 的错误和警告消息的列表 This http mindprod com jgloss compileerrormessages html我认为页面是您所需要的
  • java中高效的输入流到字符串方法

    因此 我在 Java 中的 诚然非常简单 应用程序上运行探查器 令我惊讶的是 仅次于需要在时间上发出 HTTP 请求的方法的是我的方法 inputStreamToString方法 目前它的定义如下 public static String
  • 如何杀死 Java Future?

    我正在开发的服务使用 Future 来并行运行多个任务 每个任务最多可能需要一分钟才能完成 然而 外部库似乎有问题 因为在某些情况下 2 的时间 它不会返回 在这些情况下 我想给出 2 分钟的等待时间 如果还没有返回 我想杀死 future
  • 传递自定义类型查询参数

    如何接受自定义类型查询参数 public String detail QueryParam request final MYRequest request 上面的行在启动服务器时出现错误 jersey server model ModelV
  • 当前平台不支持桌面 API

    我遇到过这个错误 java lang UnsupportedOperationException 当前平台不支持桌面 API 我将从我的 java 应用程序中打开一个文件 我用这个方法 Desktop getDesktop open new
  • 是否可以创建 Java RAM 磁盘以与 java.io.* API 一起使用?

    我正在使用一个第三方库 它基本上创建一个输出目录 其中包含不同类型的文件和子目录 我希望能够编写单元测试来确认输出正确 我希望能够将库与 RAM 磁盘一起使用 这样库所做的任何事情都不会以任何方式接触实际的磁盘板 这个想法是让测试运行和清理
  • 在 Eclipse 中删除空块之前的新行

    我更喜欢奥尔曼式 http en wikipedia org wiki Brace style Allman style大括号 例如 if foo magical prancing unicorn stuff 而不是 if foo unma
  • 我的 Kafka 流应用程序刚刚退出,代码为 0,什么也不做

    为了尝试 Kafka 流 我这样做了 public static void main String args final StreamsBuilder builder new StreamsBuilder final Properties
  • JFrame 在连续运行代码时冻结

    我在使用时遇到问题JFrame 它会冻结 连续运行代码 下面是我的代码 点击时btnRun 我调用了该函数MainLoop ActionListener btnRun Click new ActionListener Override pu
  • 始终将双精度舍入

    我怎么总是能把一个double to an int 并且永远不要将其四舍五入 我知道Math round double 但我希望它始终向上舍入 所以如果是的话3 2 四舍五入为 4 您可以使用Math ceil method 请参阅Java
  • 如何在一次操作中使用 Thymeleaf 检查 null 和空条件?

    有什么方法可以检查 Thymeleaf 中的 null 和empty 条件吗 方法一 1 variable1 variable2 variable3 2 variable null 3 variable 如果我们结合两个条件 例如 vari
  • 如何在不使用 -cp 开关的情况下在 Groovy 中自动加载数据库 jar?

    我想简化调用 Oracle 数据库的 Groovy 脚本的执行 如何将 ojdbc jar 添加到默认类路径以便我可以运行 groovy RunScript groovy 代替 groovy cp ojdbc5 jar RunScript
  • 用于生成 ISO 文件的 Maven 插件

    有没有可以生成ISO镜像的maven插件 我需要获取一些模块的输出 主要是包含 jar 的 zip 文件 并将它们组合成一个 ISO 映像 Thanks 现在有一个 ISO9660 maven 插件可以完成这项工作 https github
  • 假布尔值=真?

    我在一本书中找到了这段代码 并在 Netbeans 中执行了它 boolean b false if b true System out println true else System out println false 我只是不明白为什
  • Axis2 的 wsdl2java 在 RPC/Encoded 样式 Web 服务上失败

    Axis2 有替代方案吗 或者让它工作的方式 例如不同的数据绑定 Retrieving document at Exception in thread main org apache axis2 wsdl codegen CodeGener
  • FragmentMap + ActionBar 选项卡

    我一直在尝试插入一个MapView进入一个ActionBar Tab 但我什至无法解决问题 即使谷歌搜索 这是主要活动 Override public void onCreate Bundle savedInstanceState supe
  • 线程安全的有限大小队列,不使用锁

    我正在尝试编写一个主题队列 但遇到死锁和其他多线程问题 我想用Interlocked CompareExchange避免lock用法 但这段代码并没有按预期工作 它只是擦除整个队列 我在这里做错了什么 public class FixedS

随机推荐