天天看點

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

繼續閱讀