<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 啥都寫點 閱讀(1264) 評論(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人片天堂网无码| 国产精品深夜福利免费观看| 亚洲一区爱区精品无码| 亚洲六月丁香婷婷综合| 色哟哟国产精品免费观看| 57PAO成人国产永久免费视频| 亚洲午夜精品一级在线播放放| 亚洲国产成人在线视频| 一级成人生活片免费看| 我想看一级毛片免费的| 亚洲AV第一页国产精品| 日韩毛片一区视频免费| 久久久久国色AV免费观看性色| 国产亚洲人成A在线V网站| 亚洲精品GV天堂无码男同| 91精品国产免费入口| 亚洲色中文字幕无码AV| 久久成人无码国产免费播放| 超清首页国产亚洲丝袜| 在线观看免费播放av片| 亚洲日韩VA无码中文字幕| 国产一级一毛免费黄片| 亚洲区小说区图片区| 色噜噜的亚洲男人的天堂| 成人毛片18女人毛片免费视频未| 亚洲A∨精品一区二区三区下载| 91青青国产在线观看免费| 亚洲一线产区二线产区精华| 99爱在线观看免费完整版| 亚洲国产一成人久久精品| 国产免费伦精品一区二区三区| 亚洲精品国产高清不卡在线| 在线观看黄片免费入口不卡| 亚洲精品和日本精品| 91精品手机国产免费| 粉色视频免费入口| 亚洲av午夜成人片精品电影| 色欲aⅴ亚洲情无码AV| 国产亚洲婷婷香蕉久久精品| 日韩版码免费福利视频|