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

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

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

    Cyh的博客

    Email:kissyan4916@163.com
    posts - 26, comments - 19, trackbacks - 0, articles - 220

    線程--Callable和Future

    Posted on 2009-12-21 21:16 啥都寫點 閱讀(1269) 評論(0)  編輯  收藏 所屬分類: J2SE
           Callable是類似于Runnable的接口,實現Callable接口的類和實現Runnable的類都是可被其他線程執行的任務。
           Callable和Runnable的區別如下:

                   Callable定義的方法是call,而Runnable定義的方法是run。
                   Callable的call方法可以有返回值,而Runnable的run方法不能有返回值。
                   Callable的call方法可拋出異常,而Runnable的run方法不能拋出異常。    
           Future表示異步計算的結果,它提供了檢查計算是否完成的方法,以等待計算的完成,并檢索計算的結果。Future的cancel方法取消任務的執行,有一個布爾參數,參數為true表示立即中斷任務的執行,參數為false表示允許正在運行的任務運行完成。Future的get方法等待計算完成,獲取計算結果。
     


    import java.util.concurrent.Callable;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    import java.util.concurrent.Future;

    /**
     * Callable 和 Future接口
     * Callable是類似于Runnable的接口,實現Callable接口的類和實現Runnable的類都是可被其它線程執行的任務。
     * Callable和Runnable有幾點不同:
     * (1)Callable規定的方法是call(),而Runnable規定的方法是run().
     * (2)Callable的任務執行后可返回值,而Runnable的任務是不能返回值的。
     * (3)call()方法可拋出異常,而run()方法是不能拋出異常的。
     * (4)運行Callable任務可拿到一個Future對象,
     * Future 表示異步計算的結果。它提供了檢查計算是否完成的方法,以等待計算的完成,并檢索計算的結果。
     * 通過Future對象可了解任務執行情況,可取消任務的執行,還可獲取任務執行的結果。
     
    */

    public class CallableAndFuture {

        
    /**
         * 自定義一個任務類,實現Callable接口
         
    */

        
    public static class MyCallableClass implements Callable{
            
    // 標志位
            private int flag = 0;
            
    public MyCallableClass(int flag){
                
    this.flag = flag;
            }

            
    public String call() throws Exception{
                
    if (this.flag == 0){
                    
    // 如果flag的值為0,則立即返回
                    return "flag = 0";
                }
     
                
    if (this.flag == 1){
                    
    // 如果flag的值為1,做一個無限循環
                    try {
                        
    while (true{
                            System.out.println(
    "looping.");
                            Thread.sleep(
    2000);
                        }

                    }
     catch (InterruptedException e) {
                        System.out.println(
    "Interrupted");
                    }

                    
    return "false";
                }
     else {
                    
    // falg不為0或者1,則拋出異常
                    throw new Exception("Bad flag value!");
                }

            }

        }

        
        
    public static void main(String[] args) {
            
    // 定義3個Callable類型的任務
            MyCallableClass task1 = new MyCallableClass(0);
            MyCallableClass task2 
    = new MyCallableClass(1);
            MyCallableClass task3 
    = new MyCallableClass(2);
            
            
    // 創建一個執行任務的服務
            ExecutorService es = Executors.newFixedThreadPool(3);
            
    try {
                
    // 提交并執行任務,任務啟動時返回了一個Future對象,
                
    // 如果想得到任務執行的結果或者是異常可對這個Future對象進行操作
                Future future1 = es.submit(task1);
                
    // 獲得第一個任務的結果,如果調用get方法,當前線程會等待任務執行完畢后才往下執行
                System.out.println("task1: " + future1.get());
                
                Future future2 
    = es.submit(task2);
                
    // 等待5秒后,再停止第二個任務。因為第二個任務進行的是無限循環
                Thread.sleep(5000);
                System.out.println(
    "task2 cancel: " + future2.cancel(true));
                
                
    // 獲取第三個任務的輸出,因為執行第三個任務會引起異常
                
    // 所以下面的語句將引起異常的拋出
                Future future3 = es.submit(task3);
                System.out.println(
    "task3: " + future3.get());
            }
     catch (Exception e){
                System.out.println(e.toString());
            }

            
    // 停止任務執行服務
            es.shutdownNow();
        }

    }



                                                                                                           --    學海無涯
            

    主站蜘蛛池模板: 无人在线观看完整免费版视频| 免费人成黄页在线观看日本| 西西大胆无码视频免费| 亚洲av最新在线网址| 毛片在线全部免费观看| 久热综合在线亚洲精品| 免费精品99久久国产综合精品| 国产V亚洲V天堂A无码| 免费av片在线观看网站| 亚洲AV区无码字幕中文色| 波多野结衣免费一区视频 | 国产精品高清视亚洲一区二区| 亚洲免费福利视频| 性xxxx黑人与亚洲| 国产精品va无码免费麻豆| 免费人成网站永久| 亚洲一区AV无码少妇电影☆| 3344在线看片免费| 亚洲国产综合在线| 日韩电影免费在线观看视频| 免费观看四虎精品成人| 国产精品久久久亚洲| **真实毛片免费观看| 亚洲va中文字幕| 国产成人精品日本亚洲专区61| 香港a毛片免费观看| 最新亚洲精品国偷自产在线| 波多野结衣视频在线免费观看| 一个人免费观看视频在线中文 | 免费可以看黄的视频s色| 亚洲中文字幕久久无码| 免费a级毛片永久免费| 成人久久免费网站| 亚洲中文无码亚洲人成影院| 又爽又高潮的BB视频免费看 | 亚洲天堂男人影院| 国产精品xxxx国产喷水亚洲国产精品无码久久一区 | 亚洲乱码中文字幕手机在线| 99国产精品免费视频观看| 亚洲日韩精品国产一区二区三区 | 久久亚洲精品国产亚洲老地址|