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

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

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

    瘋狂

    STANDING ON THE SHOULDERS OF GIANTS
    posts - 481, comments - 486, trackbacks - 0, articles - 1
      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

    Callable與Future

    Posted on 2009-11-02 15:04 瘋狂 閱讀(2489) 評論(0)  編輯  收藏 所屬分類: java

    java.util.concurrent.Callable與java.util.concurrent.Future類可以協助您完成Future模式。Future模式在請求發生時,會先產生一個Future對象給發出請求的客戶。它的作用類似于代理(Proxy)對象,而同時所代理的真正目標對象的生成是由一個新的線程持續進行。真正的目標對象生成之后,將之設置到Future之中,而當客戶端真正需要目標對象時,目標對象也已經準備好,可以讓客戶提取使用。

    關于Future模式的說明,可以參考:

    http://caterpillar.onlyfun.net/Gossip/DesignPattern/FuturePattern.htm

    Callable是一個接口,與Runnable類似,包含一個必須實現的方法,可以啟動為讓另一個線程來執行。不過Callable工作完成后,可以傳回結果對象。Callable接口的定義如下:

    public interface Callable<V> {
                V call() throws Exception;
                }
                

    例如,可以使用Callable完成某個費時的工作,工作結束后傳回結果對象,例如求質數范例15.24:

    范例15.24  PrimeCallable.java

    package onlyfun.caterpillar;
    import java.util.ArrayList;
                import java.util.List;
                import java.util.concurrent.Callable;

     

    public class PrimeCallable implements Callable<int[]> {
    private int max;

    public PrimeCallable(int max) {
     this.max = max;
    }

    public int[] call() throws Exception {
    int[] prime = new int[max+1];

    List<Integer> list = new ArrayList<Integer>();

     

    for(int i = 2; i <= max; i++)
    prime[i] = 1;

     

    for(int i = 2; i*i <= max; i++) { // 這里可以改進
    if(prime[i] == 1) {
    for(int j = 2*i; j <= max; j++) {
    if(j % i == 0)
    prime[j] = 0;
    }
    }
    }

     

    for(int i = 2; i < max; i++) {
    if(prime[i] == 1) {
    list.add(i);
    }
    }

    int[] p = new int[list.size()];
    for(int i = 0; i < p.length; i++) {
     p[i] = list.get(i).intValue();
    }

    return p;

    }

    程序中的求質數方法是很簡單的,但效率不好,這里只是為了示范方便,才使用簡單的求質數方法,要更有效率地求質數,可以參考Eratosthenes篩選求質數:

    http://caterpillar.onlyfun.net/Gossip/AlgorithmGossip/EratosthenesPrime.htm

    假設現在求質數的需求是在啟動PrimeCallable后的幾秒之后,則可以使用Future來獲得Callable執行的結果,從而在未來的時間點獲得結果,例如范例15.25:

    范例15.25  FutureDemo.java

    package onlyfun.caterpillar;
    import java.util.concurrent.Callable;
                import java.util.concurrent.ExecutionException;
                import java.util.concurrent.FutureTask;
    public class FutureDemo {
                public static void main(String[] args) {
                Callable<int[]> primeCallable = new PrimeCallable(1000);
                FutureTask<int[]> primeTask =
                new FutureTask<int[]>(primeCallable);
                Thread t = new Thread(primeTask);
                t.start();
                try {
                // 假設現在做其他事情
                Thread.sleep(5000);
                // 回來看看質數找好了嗎
                if(primeTask.isDone()) {
                int[] primes = primeTask.get();
                for(int prime : primes) {
                System.out.print(prime + " ");
                }
                System.out.println();
                }
                } catch (InterruptedException e) {
                e.printStackTrace();
                } catch (ExecutionException e) {
                e.printStackTrace();
                } 
                }
                }

    java.util.concurrent.FutureTask是一個代理,真正執行找質數功能的是Callable對象。使用另一個線程啟動FutureTask,之后就可以做其他的事了。等到某個時間點,用isDone()觀察任務是否完成,如果完成了,就可以獲得結果。一個執行結果如下,顯示所有找到的質數:

    2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61
                67 71 73 79 83 89 97 101 103 107 109 113 127 131
                137 139 149 151 157 163 167 173 179 181 191 193
                197 199 211 223 227 229 233 239 241 251 257 263
                269 271 277 281 283 293 307 311 313 317 331 337
                347 349 353 359 367 373 379 383 389 397 401 409
                419 421 431 433 439 443 449 457 461 463 467 479
                487 491 499 503 509 521 523 541 547 557 563 569
                571 577 587 593 599 601 607 613 617 619 631 641
                643 647 653 659 661 673 677 683 691 701 709 719
                727 733 739 743 751 757 761 769 773 787 797 809
                811 821 823 827 829 839 853 857 859 863 877 881
                883 887 907 911 919 929 937 941 947 953 967 971
                977 983 991 997

    用戶可能需要快速翻頁瀏覽文件,但在瀏覽到有圖片的頁數時,由于圖片文件很大,導致圖片加載較慢,造成用戶瀏覽文件時會有停頓的現象。因此希望在文件開啟之后,仍有一個后臺作業持續加載圖片。這樣,用戶在快速瀏覽頁面時,所造成的停頓可以獲得改善,從而可以考慮使用這里所介紹的功能

    主站蜘蛛池模板: 久久亚洲国产精品| 亚洲AV无码一区二区三区鸳鸯影院 | 亚洲高清专区日韩精品| 亚洲大片免费观看| 国产成人va亚洲电影| 亚洲a一级免费视频| 女人18毛片水最多免费观看| 一区二区三区免费视频网站| 亚洲ⅴ国产v天堂a无码二区| 免费无遮挡无码视频网站| 成人国产网站v片免费观看| 亚洲欧洲日本天天堂在线观看| 午夜亚洲福利在线老司机| 久久久久高潮毛片免费全部播放| 亚洲aⅴ无码专区在线观看春色| 久久久久亚洲?V成人无码| 91免费播放人人爽人人快乐| 成人福利在线观看免费视频| 亚洲黄色激情视频| 亚洲阿v天堂在线| 一本色道久久88亚洲综合| 免费观看无遮挡www的小视频| 特黄特色的大片观看免费视频| 亚洲欧洲校园自拍都市| 亚洲女同成av人片在线观看| 日韩中文字幕在线免费观看 | 亚洲欧洲自拍拍偷精品 美利坚| 亚洲精品在线免费观看视频| 又长又大又粗又硬3p免费视频| 亚洲狠狠成人综合网| 亚洲国产成人精品无码区在线观看| 免费日本黄色网址| 久久久久国色AV免费观看性色| 无码国产精品一区二区免费vr| 日本特黄特色AAA大片免费| 亚洲一卡2卡三卡4卡无卡下载| 亚洲精品在线不卡| 亚洲2022国产成人精品无码区| 超清首页国产亚洲丝袜| 亚洲AV无码一区二三区| 日本牲交大片免费观看|