自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

SwingWorker()構(gòu)造器的線程

開發(fā) 后端
本文介紹SwingWorker()構(gòu)造器的線程,SwingWorker是作為一個(gè)Runnable被QueuedExecutor執(zhí)行的。

演示程序用SwingWorker()構(gòu)造器在后臺(tái)執(zhí)行費(fèi)時(shí)的操作,然后更新UI。
這個(gè)演示程序所用的SwingWorker是基于《使用SwingWorker線程》文中提出的SwingWorker類,但重新實(shí)現(xiàn)了它以修正一處競(jìng)態(tài)條件,添加超時(shí)支持,和改進(jìn)了異常處理。
這個(gè)新的實(shí)現(xiàn)還基于DougLea的util.concurrent包的FutureResult類(參見“參考資料”一節(jié))。由于大量依賴了FutureResult所做的工作,SwingWorker類的實(shí)現(xiàn)是簡(jiǎn)單而靈活的。
本節(jié)的余下部分更詳細(xì)地描述了實(shí)現(xiàn)的細(xì)節(jié),請(qǐng)繼續(xù)往下看或直接跳到后面下載源碼。
RunnableFutureResult

FutureResult,正如它的名字所暗示的,它是用來(lái)保持某動(dòng)作的結(jié)果的。它被設(shè)計(jì)成和一個(gè)Callable共同使用,Callable是一個(gè)會(huì)返回結(jié)果的runnable動(dòng)作:

  1. publicinterfaceCallable{  
  2. Objectcall()throwsException;  

新的SwingWorker是一個(gè)RunnableFutureResult。在運(yùn)行時(shí),它把結(jié)果設(shè)成construct()的返回值,然后在事件派發(fā)線程中調(diào)用finished()方法。(注意:SwingWorker是一個(gè)抽象類;你要子類化它并實(shí)現(xiàn)construct()和finished()。)
下面的代碼來(lái)自SwingWorker的run()方法:

  1. Callablefunction=newCallable(){  
  2. publicObjectcall()throwsException{  
  3. returnconstruct();  
  4. }  
  5. }; 

 

  1. RunnabledoFinished=newRunnable(){  
  2. publicvoidrun(){  
  3. finished();  
  4. }  
  5. };  
  6.  
  7. setter(function).run();  
  8. SwingUtilities.invokeLater(doFinished); 

***段把construct()轉(zhuǎn)換成一個(gè)Callable動(dòng)作,第二段把finished()轉(zhuǎn)換成作為Runnable的doFinished。然后setter(function)被運(yùn)行,doFinished被調(diào)用。
setter(function)

上面缺少的部分是setter(function)。它創(chuàng)建一個(gè)刻板的Runnable。在運(yùn)行時(shí),這個(gè)Runnable調(diào)用參數(shù)指定的function,然后給結(jié)果設(shè)置返回值。下面是來(lái)自FutureResult的代碼:

  1. publicRunnablesetter(finalCallablefunction){  
  2. returnnewRunnable(){  
  3. publicvoidrun(){  
  4. try{  
  5. set(function.call());  
  6. }  
  7. catch(Throwableex){  
  8. setException(ex);  
  9. }  
  10. }  
  11. };  

注意try-catch塊所作的防護(hù)。如果construct()拋出任何東西(Exception、Error等等),都會(huì)被捕捉并記錄下來(lái)。
不要搶跑:先construct,再start

調(diào)用start()來(lái)啟動(dòng)worker線程。這是修訂版的SwingWorker和原來(lái)版本的一個(gè)重要區(qū)別。
在原來(lái)的版本中,SwingWorker()構(gòu)造器自動(dòng)啟動(dòng)線程,這種做法帶來(lái)了一個(gè)線程和子類構(gòu)造器競(jìng)爭(zhēng)的危險(xiǎn):當(dāng)SwingWorker()構(gòu)造器已啟動(dòng)了線程,而子類的構(gòu)造器還沒完成。彌補(bǔ)方法是,先構(gòu)造SwingWorker,然后再調(diào)用start()。
順便一提,RemoteTable并不調(diào)用start()。正確來(lái)說(shuō),SwingWorker是作為一個(gè)Runnable被QueuedExecutor執(zhí)行的。

【編輯推薦】

  1. 介紹JavaFX功能與Swing的關(guān)系
  2. 淺談Swing中l(wèi)ookandfeel源代碼
  3. 概述Swing中的Timer對(duì)象
  4. 淺析Swing中actionPerformed()方法
  5. 詳解所有的Swing核心組件
責(zé)任編輯:佚名 來(lái)源: cnblogs
相關(guān)推薦

2009-07-10 09:05:20

SwingWorker

2009-07-10 09:30:41

SwingWorker

2009-07-17 10:58:12

SwingWorker

2009-07-17 17:47:39

SwingWorker

2009-07-21 12:35:00

Scala從構(gòu)造器

2009-10-12 13:32:58

VB.NET線程構(gòu)造器

2009-07-17 17:34:03

SwingWorker異常處理

2009-07-17 14:57:41

SwingWorkerSwing程序

2012-05-16 13:45:24

Java構(gòu)造器

2011-05-16 10:35:02

jQuery

2019-10-22 08:45:07

Java構(gòu)造器編程語(yǔ)言

2017-04-17 08:44:43

構(gòu)造函數(shù)線程安全

2012-02-27 14:09:00

Java

2022-04-15 08:30:00

Lombok@Builde構(gòu)建器

2009-04-30 09:10:42

JavaSwing線程安全

2025-02-11 08:31:37

Java關(guān)鍵字安全

2010-01-18 10:28:15

C++編譯器

2009-12-17 10:18:17

Ruby創(chuàng)建構(gòu)造器

2013-05-06 09:59:48

2025-02-06 13:23:09

C++函數(shù)參數(shù)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)