JavaFX笔记

A
javafx.concurrent.Service只能用在FX中,具体地说是必须在Application已经launch后,否则抛出异常:
java.lang.IllegalStateException: Service must only be used from the FX Application Thread
没有GUI也可以,只要used from the FX Application Thread。

B
把窗口放于桌面中心(Windows OS下不包括任务栏):

    public void setStageCenterOnScreen(Stage stage){
        stage.centerOnScreen();
        stage.setY(stage.getY()*3/2);
    }

C
Task会被生成一个独立线程,Service如果要访问Task中的属性和方法,需要处理线程同步问题。所以这个典范是,Task是黑箱式的。

D
Application中的public void start(Stage stage)方法,参数中的stage已经存在了。这个典范是,网页模式,浏览器中,所有功能都是在一个标签页中完成的,不同的功能使用切换超链接来切换。也就是只用一个stage,更换不同的scene。

E
异常。原则上都向上抛出,一直抛到Service上,在Service外面处理。message是用于非异常流程的。对界面的访问也是全部放在Service外面的,Service就是Service,分离出来的。

F
Service的取消——cancel()。
线程的中断,如果中断某线程的时候碰上Object.wait, Thread.join和Thread.sleep这类语句正在执行,即它正在sleep你让它sleep,那么,该线程会抛出异常(InterruptedException)进入抛出异常的语法流程。意思就是它本打算休息之后继续干活,你“吵醒”它,它生气了就扔个“板砖”后拉倒。所以interrupt()适合配合Thread.sleep使用。Object.notify()配合Object.wait()使用。而Service的取消——cancel(),是停止任务线程的执行并舍弃该线程,此任务被放弃,restart()的时候重新new一个Task。只不过在一些情况下,例如正在Thread.sleep的时候,cancel()会伴随着异常的抛出,Task的异常属性会被更新,但failed()方法不会被执行。可见,cancel()一个任务可能会导致任务执行不完整。
在可以划分成多部分的任务中,例如重复执行,保证任务完整性的办法是JAVA早期采用的办法,即设置标志。需要把标志设为同步的(volatile)以防止访问冲突。不过与设置标志相比,调用cancel()的好处是该线程是“立即执行”停止命令的。
关于在Task中捕获异常。典范是,凡是例外都向上抛出异常,任务自然停止。特殊情况下,某异常产生时任务也继续,即对该任务而言该异常不是例外。那么,当然就在任务中对该异常进行捕获。这种情况下需要注意的是,虽然在Task中手动捕获了异常,但是异常仍然会被Task捕获并送到Service上,Task的failed()方法仍然会被调用。即异常是“双重捕获处理”的。但是任务不会自动停止,Service的State也不会变成FAILED。这个“双重捕获处理”,目前的测试是如此。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值