javafx中的线程

如何在javafx中使用线程?

这个问题的中心其实是如何在图形化界面中使用多线程。
java的线程类是Thread,其他一些类如Timer其实也是继承自Thread,然而在有关图形化界面的构造中,使用Thread却会报错,或者是达不到线程运行的效果。实际上,图形化界面的构造可以理解成一个树形结构,同时这个树形结构需要保证一致性,即构造树的过程实际上是串行的。

以下问题就可能会出现:

  1. 使用多线程来完成图形化界面的构造,比如设计加载条和任务同时进行,然而实际上的效果是加载条没有变,而是等到任务完成时才开始图形界面的渲染。
  2. NullPointException,这种错误比较奇葩,之后解释我出现这种问题的情况。
    那么,要如何实现多线程呢?

实际上,图形化界面的构造中不能做到并行,只能做到并发,javafx提供了一个Timeline类用来实现图形界面的并发。当然在这里我不打算详细介绍,具体的可以去参考相关文档。Timeline的核心就是错开执行,也就是并发,它可以设置每隔多少时间执行一次。也就是说,只要把原来需要用Thread执行的任务交给Timeline来做就可以了。

如何在javafx中使用Timer

本来直接使用Timeline来代替Thread就可以了,不过事情没有这么简单。假设你想要使用定时任务,又不得不回到Thread上来(先前说过,Timer继承自Thread),除非你自己用Timeline写一个。不过我们不应该重复制造车轮,所以还是要解决问题。

有一个很简单的思路,其实就是嵌套,把Timer和Timeline嵌套使用就可以了,比如在一个TimeTask类的run中嵌套一个Timeline,并执行Timeline的play()函数。

一般情况下,这个方法不会有问题,但是在动画较多的情况下,就可能会出现NullPointException,这个问题来源于Thread类的报错,最终可以追溯到AbustractTimeMaster,也就是上述的第二种情况。这个问题我也不大理解,不过可以简单概括为处理能力不够。实际上也有其他情况会报出类似的错误,总体来说都是资源消耗较大的情况下出现的。

解决办法是嵌套一个Platfrom.runlater(),这个方法可以传入一个继承Runnerable接口的参数,实际上直接可以使用lambda函数嵌套。上述情况来看,就是把嵌套的Timeline换成这个函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值