SwingWorker增強異常處理
新的SwingWorker支持超時,這是通過覆蓋getTimeout()方法已返回一個非零值來實現(xiàn)的。當(dāng)超出超時時間,worker線程會被中斷。
如果想查看使用超時的例子,請參閱注釋版的getTimeout()方法和DynamicTree如何處理TimeoutException。
超時功能是用TimedCallable來實現(xiàn)的,其中使用了FutureResult的timedGet()方法。
增強的異常處理
construct()方法拋出的任何東西都會被記錄。除了死循環(huán)和死鎖,新的異常處理確保了SwingWorker處于“準(zhǔn)備好”的狀態(tài)。也就是說,它要么得到一個正確的結(jié)果,要么得到一個異常。
下面的get()方法用來取出結(jié)果。這個方法繼承自FutureResult:
◆publicObjectget()
◆throwsInvocationTargetException,InterruptedException
如果construct()拋出一個Exception,get()方法就會拋出InvocationTargetException。要獲得construct()方法實際上拋出的異常,可以調(diào)用getTargetException()進行異常處理。
如果取結(jié)果的線程在等待結(jié)果的過程中被中斷,get()方法會拋出InterruptedException——但這種情況對SwingWorker來說很罕見,因為取結(jié)果的線程通常都是事件派發(fā)線程,并且在finished()會被調(diào)用以前,結(jié)果總是已經(jīng)準(zhǔn)備好的。
更多調(diào)用工具
SwingWorker的實現(xiàn)在jozart.swingutils包中。在同一個包里,你還能找到InvokeUtils類,這個類還提供了幾個invokeXXX()方法。后臺線程可以用這些方法來在事件派發(fā)線程中獲取值和用戶輸入,再把結(jié)果返回到后臺線程。
【編輯推薦】