<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    John Jiang

    a cup of Java, cheers!
    https://github.com/johnshajiang/blog

       :: 首頁 ::  :: 聯(lián)系 :: 聚合  :: 管理 ::
      131 隨筆 :: 1 文章 :: 530 評論 :: 0 Trackbacks
    使用Callable返回結果
        本文是Sun官方以Blog形式發(fā)布的Java核心技術竅門(JavaCoreTechTip)中的一個。本文主要介紹了Callable及其相關接口和類的使用,篇幅不長且易于理解,故翻譯在了此處,相信對于準備或剛接觸java.util.concurrent的朋友會有所幫助。(2008.05.31最后更新)

        自從Java平臺的最開始,Runnable接口就已存在了。它允許你定義一個可由線程完成的任務。如大多數(shù)人所已知的那樣,它只提供了一個run方法,該方法既不接受任何參數(shù),也不返回任何值。如果你需要從一個未完成的任務中返回一個值,你就必須在該接口之外使用一個方法去等待該任務完成時通報的某種消息。例如,下面的示例就是你在這種情景下可能做的事情:
        Runnable runnable = ...;
        Thread t = new Thread(runnable);
        t.start();
        t.join();
        String value = someMethodtoGetSavedValue()
    嚴格來說,上述代碼并無錯誤,但現(xiàn)在可用不同的方法去做,這要感謝J2SE 5.0引入的Callable接口。不同于Runnable接口擁有run方法,Callable接口提供的是call方法,該方法可以返回一個Object對象,或可返回任何一個在泛型化格式中定義了的特定類型的對象。
        public interface Callable<V> {
           V call() throws Exception;
        }
    因為你不可能把Callable對象傳到Thread對象去執(zhí)行,你可換用ExecutorService對象去執(zhí)行Callable對象。該服務接受Callable對象,并經(jīng)由submit方法去執(zhí)行它。
        <T> Future<T> submit(Callable<T> task)
    如該方法的定義所示,提交一個Callable對象給ExecutorService會返回一個Future對象。然后,F(xiàn)uture的get方法將會阻塞,直到任務完成。
        為了證明這一點,下面的例子為命令行中的每個詞都創(chuàng)建一個單獨的Callable實例,然后把這些詞的長度加起來。各個Callable對象將只是計算它自己的詞的長度之和。Futures對象的Set集合將被保存以便從中獲得計算用的值。如果需要保持返回值的順序,則可換用一個List對象。

    import java.util.*;
    import java.util.concurrent.*;

    public class CallableExample {

        
    public static class WordLengthCallable
                
    implements Callable {
            
    private String word;
            
    public WordLengthCallable(String word) {
                
    this.word = word;
            }
            
    public Integer call() {
                
    return Integer.valueOf(word.length());
            }
        }

        
    public static void main(String args[]) throws Exception {
            ExecutorService pool 
    = Executors.newFixedThreadPool(3);
            Set
    <Future<Integer>> set = new HashSet<Future&lg;Integer>>();
            
    for (String word: args) {
                Callable
    <Integer> callable = new WordLengthCallable(word);
                Future
    <Integer> future = pool.submit(callable);
                set.add(future);
            }
            
    int sum = 0;
            
    for (Future<Integer> future : set) {
                sum 
    += future.get();
            }
            System.out.printf(
    "The sum of lengths is %s%n", sum);
            System.exit(sum);
        }
    }
    WordLengthCallable保存了每個詞并使用該詞的長度作為call方法的返回值。這個值可能會花點兒時間去生成,不過在這個例子中,可以立即知道它。 call方法的唯一要求是這個值要在call方法的結尾處返回。當Future的get方法稍后被調(diào)用時,如果任務運行得很快的話,F(xiàn)uture將會自動得到這個值(如同本例的情況),否則將一直等到該值生成完畢為止。多次調(diào)用get方法不會導致任務從該線程返回。因為該程序的目的是計劃所有字的長度之和,它不會強令Callable任務結束。如果最后一個任務在前三個任務之前完成,也是沒錯的。對Future的get方法的第一次調(diào)用將只會等待Set中第一個任務結束,而不會阻塞其它的任務分別執(zhí)行完畢。它只會等待當次線程或任務結束。這個特定的例子使用固定數(shù)線程池來產(chǎn)生ExecutorService對象,但其它有效的方法也是可行的。
        關于執(zhí)行器和線程池用法的更多信息,請見Java Tutorial中Executors一節(jié)。SwingWorker類是另一個使用Future的Runnable對象的例子,盡管有些微不同之處。更多信息請見Java Tutorial中Worker Threads and SwingWorker一節(jié)。

    posted on 2008-05-31 22:24 John Jiang 閱讀(3859) 評論(0)  編輯  收藏 所屬分類: JavaSEJavaConcurrency翻譯CoreJavaTechTips
    主站蜘蛛池模板: 亚洲av成人一区二区三区观看在线| 亚洲精品乱码久久久久66| 亚洲福利电影一区二区?| a毛片在线看片免费| 亚洲AV无码专区在线电影成人 | 久久久久国色AV免费观看| 最近2019免费中文字幕视频三| 亚洲色婷婷六月亚洲婷婷6月| 日韩精品亚洲人成在线观看| 在线看片免费人成视频福利| 久久精品国产亚洲麻豆| 日本免费在线中文字幕| 亚洲欧洲精品国产区| 日本在线高清免费爱做网站| 中文有码亚洲制服av片| 看全色黄大色大片免费久久| 亚洲av午夜电影在线观看| 亚洲AV蜜桃永久无码精品| 一二三区免费视频| 国产亚洲人成网站在线观看不卡| 成全视频在线观看免费| 亚洲视频一区二区在线观看| 成人免费一级毛片在线播放视频 | 伊人亚洲综合青草青草久热| 中文字幕的电影免费网站| 自怕偷自怕亚洲精品| 67194成是人免费无码| 亚洲日韩在线中文字幕综合| 国产日产亚洲系列最新| 亚洲欧美日韩国产精品一区| 久久久免费的精品| 亚洲首页国产精品丝袜| 九月婷婷亚洲综合在线| 国产99视频精品免费专区| 色老板亚洲视频免在线观| 亚洲精品成人网久久久久久 | 在线jlzzjlzz免费播放| 免费国产va视频永久在线观看| 亚洲国产精品无码一线岛国| A级毛片内射免费视频| 一个人看的免费高清视频日本|