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(){});