溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

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

發(fā)布時(shí)間:2021-12-24 15:49:26 來源:億速云 閱讀:99 作者:柒染 欄目:編程語言

今天就跟大家聊聊有關(guān)SwingWorker()構(gòu)造器的線程是怎樣的,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

演示程序用SwingWorker()構(gòu)造器在后臺(tái)執(zhí)行費(fèi)時(shí)的操作,然后更新UI。
這個(gè)新的實(shí)現(xiàn)還基于DougLea的util.concurrent包的FutureResult類。由于大量依賴了FutureResult所做的工作,SwingWorker類的實(shí)現(xiàn)是簡(jiǎn)單而靈活的。
本節(jié)的余下部分更詳細(xì)地描述了實(shí)現(xiàn)的細(xì)節(jié),請(qǐng)繼續(xù)往下看或直接跳到后面下載源碼。
RunnableFutureResult

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

publicinterfaceCallable{  Objectcall()throwsException;  }

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

Callablefunction=newCallable(){  publicObjectcall()throwsException{  returnconstruct();  }  };
RunnabledoFinished=newRunnable(){  publicvoidrun(){  finished();  }  };   setter(function).run();  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è)置返回值。下面是來自FutureResult的代碼:

publicRunnablesetter(finalCallablefunction){  returnnewRunnable(){  publicvoidrun(){  try{  set(function.call());  }  catch(Throwableex){  setException(ex);  }  }  };  }

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

調(diào)用start()來啟動(dòng)worker線程。這是修訂版的SwingWorker和原來版本的一個(gè)重要區(qū)別。
在原來的版本中,SwingWorker()構(gòu)造器自動(dòng)啟動(dòng)線程,這種做法帶來了一個(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()。正確來說,SwingWorker是作為一個(gè)Runnable被QueuedExecutor執(zhí)行的。

看完上述內(nèi)容,你們對(duì)SwingWorker()構(gòu)造器的線程是怎樣的有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝大家的支持。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI