天天看点

javafx并发初步

javafx.concurrency并发包是为方便javafx application thread也就是javafx的ui线程与后台线程安全交互的工具包。

worker接口封装了worker.state枚举作为worker的状态:ready,scheduled,running,succeded,failed,cancelled.

worker拥有下面这些只读property.

worker同时有这些状态对应的proeprt那就是state,以便于javafx application thread可以进行observable.

worker还拥有除了状态对应的property之外几个个有用的property:progress,totalwork,message,title,value,exception,running, workdone

woker有三个直接实现:task与service,scheduledservice,根据不同的实现决定worker的可复用性,task是不可以重用的,只能被执行一次,而service可以重复执行。

类:task,service, scheduledservice,他们都实现了eventtarget接口,并拥有addeventhandler()方法,可以检测通过workerstateevent对象进行检测状态的变化。当然也可以通过property bindings机制代替。

task继承了java.util,concurrency.futuretask类。

task是不可以重复执行的worker

运行方式:1. new thread(task).start();

2.executorservice.submit(task);

3.其他。

task中有许多updatexxx方法用于改变相应的property。setonxxx方法用于设置eventhandler.

继承task需要覆盖其call()方法,call()方法会在后台线程中被调用。

由于java中并没有安全的线程中断机制,所以你必须在call()方法内部对iscancelled()进行判断

如果你想在线程中运行thread.sleep(),那么你就需要捕获interruptexception并进行iscancelled的两次检查。

典型的例子就是更新进度的问题:这里通过property bindings机制

注意:updateprogress(workdone,totalwork);它会同时更新progress,totalwork,workdone三个property.

service会封装task,并负责后台执行它封装的task。

service是可重复执行的。

service可以被注入executor依赖,并通过注入的executor执行实际的task。否则service只会构造一个简单的thread执行。

service通过service的start()方法执行任务。

可以通过workerstateevent监听变化。

scheduledservice是一个可以自动重新开始的任务执行器。

scheduledservice在fails失败时是否会自动重新开始以及自动执行的次数取决于:restartonfailure,backoffstrategy,cumulativeperiod,几个property,

对于确实需要在另外一个线程与application thread进行交互的可以使用platform.runlater(new runnable(){});

继续阅读