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

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

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

    新的起點(diǎn) 新的開始

    快樂(lè)生活 !

    深入淺出多線程(3)-Future異步模式以及在JDK1.5Concurrent包中的實(shí)現(xiàn)

       接深入淺出多線程(2)在多線程交互的中,經(jīng)常有一個(gè)線程需要得到另個(gè)一線程的計(jì)算結(jié)果,我們常用的是Future異步模式來(lái)加以解決。
       什么是Future模式呢?Future 顧名思義,在金融行業(yè)叫期權(quán),市場(chǎng)上有看跌期權(quán)和看漲期權(quán),你可以在現(xiàn)在(比如九月份)購(gòu)買年底(十二月)的石油,假如你買的是看漲期權(quán),那么如果石油真的漲了,你也可以在十二月份依照九月份商定的價(jià)格購(gòu)買。扯遠(yuǎn)了,F(xiàn)uture就是你可以拿到未來(lái)的結(jié)果。對(duì)于多線程,如果線程A要等待線程B的結(jié)果,那么線程A沒(méi)必要等待B,直到B有結(jié)果,可以先拿到一個(gè)未來(lái)的Future,等B有結(jié)果是再取真實(shí)的結(jié)果。其實(shí)這個(gè)模式用的很多,比如瀏覽器下載圖片的時(shí)候,剛開始是不是通過(guò)模糊的圖片來(lái)代替最后的圖片,等下載圖片的線程下載完圖片后在替換。如圖所示:


    • 在沒(méi)有JDK1.5提供的Concurrent之前,我們通過(guò)自定義一個(gè)結(jié)果類,負(fù)責(zé)結(jié)果持有。
    如下面代碼:
    package vincent.blogjava.net;

    public class FutureResult {
        
    private String result;
        
    private boolean isFinish =false;
        
    public String getResult() {
            
    return result;
        }
        
    public synchronized void setResult(String result) {
            
    this.result = result;
            
    this.isFinish = true;
        }
        
    public synchronized boolean isFinish() {
            
    return isFinish;
        }

    }
    存儲(chǔ)結(jié)果值和是否完成的Flag。
    package vincent.blogjava.net;

    public class GenerateResultThread extends Thread{
        FutureResult fr ;
        
    public GenerateResultThread(FutureResult fr ){
            
    this.fr = fr;
        }
        
    public  void run(){
            
    //模仿大量耗時(shí)計(jì)算后(5s)返回結(jié)果。
            try {
                System.out.println(
    "GenerateResultThread開始進(jìn)行計(jì)算了!");
                Thread.sleep(
    5000);
            } 
    catch (InterruptedException e) {
                
    // TODO Auto-generated catch block
                e.printStackTrace();
            }
            fr.setResult(
    "ResultByGenerateResultThread");
        }
    }
    計(jì)算具體業(yè)務(wù)邏輯并放回結(jié)果的線程。
    package vincent.blogjava.net;

    public class Main {

        
    /**
         * 
    @param args
         * 
    @throws InterruptedException 
         
    */
        
    public static void main(String[] args) throws InterruptedException {
            
    // TODO Auto-generated method stub
           FutureResult fr = new FutureResult();
           
    new GenerateResultThread(fr).start();
           
    //main線程無(wú)需等待,不會(huì)被阻塞。
           
    //模仿 干自己的活 2s。
           Thread.sleep(2000);
           
    // 估計(jì)算完了吧 取取試試。
           System.out.println("過(guò)來(lái)2s了,看看有結(jié)果嗎?");
           
    if(!fr.isFinish()){System.out.println("還沒(méi)有完成呢! 繼續(xù)干自己活吧!");}
           
    //模仿 干自己的活 4s。
           Thread.sleep(4000);
           System.out.println(
    "過(guò)來(lái)4s了,看看有結(jié)果嗎?");
           
    if(fr.isFinish()){
               System.out.println(
    "完成了!");
               System.out.println(
    "Result:"+fr.getResult());
               
           }
        }

    }
    Main方法需要GenerateResultThread線程計(jì)算的結(jié)果,通過(guò)這種模式,main線程不需要阻塞。結(jié)果如下:
    GenerateResultThread開始進(jìn)行計(jì)算了!
    過(guò)來(lái)2s了,看看有結(jié)果嗎?
    還沒(méi)有完成呢! 繼續(xù)干自己活吧!
    過(guò)來(lái)4s了,看看有結(jié)果嗎?
    完成了!
    Result:ResultByGenerateResultThread
    •  在JDK1.5 Concurrent 中,提供了這種Callable的機(jī)制。我們只要實(shí)現(xiàn)Callable接口中的Call方法,Call方法是可以返回任意類型的結(jié)果的。如下:
    package vincent.blogjava.net;

    import java.util.concurrent.Callable;
    import java.util.concurrent.ExecutionException;
    import java.util.concurrent.Future;
    import java.util.concurrent.FutureTask;

    public class ConcurrentImpl {

    public static void main(String[] args) throws InterruptedException, Exception {
        FutureTask  fr 
    = new FutureTask(new Returnresult());
        
    new Thread(fr).start();
           
    //main線程無(wú)需等待,不會(huì)被阻塞。
           
    //模仿 干自己的活 2s。
           Thread.sleep(2000);
           
    // 估計(jì)算完了吧 取取試試。
           System.out.println("過(guò)來(lái)2s了,看看有結(jié)果嗎?");
           
    if(!fr.isDone()){System.out.println("還沒(méi)有完成呢! 繼續(xù)干自己活吧!");}
           
    //模仿 干自己的活 4s。
           Thread.sleep(4000);
           System.out.println(
    "過(guò)來(lái)4s了,看看有結(jié)果嗎?");
           
    if(fr.isDone()){
               System.out.println(
    "完成了!");
               System.out.println(
    "Result:"+fr.get());
    }
    }
    }
    class Returnresult implements Callable{

        @Override
        
    public Object call() throws Exception {
            
    //模仿大量耗時(shí)計(jì)算后(5s)返回結(jié)果。
            System.out.println("GenerateResultThread開始進(jìn)行計(jì)算了!");
            Thread.sleep(
    11000);
            
    return "ResultByGenerateResultThread";
        }
        
    }
    Returnresult 實(shí)現(xiàn)了Callable接口,在Call方法中實(shí)現(xiàn)業(yè)務(wù)邏輯,并返回結(jié)果。在Main方法里面,初始化FutureTask 并將該Task作為Runnable加入Thread后,啟動(dòng)線程。得到跟剛才相同的效果。
    注意: 通過(guò)JDK標(biāo)準(zhǔn)的Future后,沒(méi)有必要增加額外的Object來(lái)只有Result,更加簡(jiǎn)單明了,同時(shí)FutureTask還提供了Cancel的功能,我們持有FutureTask引用后可以Cancel該線程。通過(guò)get()取值是,如果結(jié)果還沒(méi)有返回,將會(huì)阻塞Main線程。

    •   其實(shí)JDK 實(shí)現(xiàn)Future模式的秘密就在FutureTask類里:
    FutureTask是實(shí)現(xiàn)了Future 和Runnable,對(duì)了就是Runnbale接口,我們就可以把它構(gòu)造到Thread里,啟動(dòng)執(zhí)行了。
    看看,當(dāng) new Thread(new FutureTask(new Callable())).start 時(shí):
    看圖:
    G
    get 方法取result值,F(xiàn)utureTask 提供Timeout 功能,如果超時(shí),拋出異常。


    posted on 2008-09-03 00:57 advincenting 閱讀(2635) 評(píng)論(4)  編輯  收藏

    評(píng)論

    # re: 深入淺出多線程(3)-Future異步模式以及在JDK1.5Concurrent包中的實(shí)現(xiàn)[未登錄](méi) 2008-09-03 08:40 tester

    好文  回復(fù)  更多評(píng)論   

    # re: 深入淺出多線程(3)-Future異步模式以及在JDK1.5Concurrent包中的實(shí)現(xiàn) 2008-09-03 08:53 denni

    寫的深入淺出,很好  回復(fù)  更多評(píng)論   

    # re: 深入淺出多線程(3)-Future異步模式以及在JDK1.5Concurrent包中的實(shí)現(xiàn) 2008-09-03 18:15 Jack.Wang

    雖然東西很簡(jiǎn)單,但寫的很認(rèn)真!很好!  回復(fù)  更多評(píng)論   

    # re: 深入淺出多線程(3)-Future異步模式以及在JDK1.5Concurrent包中的實(shí)現(xiàn) 2009-02-12 17:24 wego

    不錯(cuò)!我試了一下,很好!  回復(fù)  更多評(píng)論   


    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     

    公告

    Locations of visitors to this pageBlogJava
  • 首頁(yè)
  • 新隨筆
  • 聯(lián)系
  • 聚合
  • 管理
  • <2008年9月>
    31123456
    78910111213
    14151617181920
    21222324252627
    2829301234
    567891011

    統(tǒng)計(jì)

    常用鏈接

    留言簿(13)

    隨筆分類(71)

    隨筆檔案(179)

    文章檔案(13)

    新聞分類

    IT人的英語(yǔ)學(xué)習(xí)網(wǎng)站

    JAVA站點(diǎn)

    優(yōu)秀個(gè)人博客鏈接

    官網(wǎng)學(xué)習(xí)站點(diǎn)

    生活工作站點(diǎn)

    最新隨筆

    搜索

    積分與排名

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    主站蜘蛛池模板: 亚洲精品你懂的在线观看| 日本免费一区二区三区| 曰批全过程免费视频免费看| 亚洲av无码专区亚洲av不卡| 鲁死你资源站亚洲av| 亚洲av日韩专区在线观看| 在线精品自拍亚洲第一区| 国产AV无码专区亚洲AV琪琪| 人与动性xxxxx免费| eeuss草民免费| 国产又黄又爽胸又大免费视频| 丝袜足液精子免费视频| 免费福利在线视频| 91大神在线免费观看| 黄在线观看www免费看| 亚洲经典在线中文字幕| 亚洲视频一区在线| 亚洲一区无码中文字幕乱码| 亚洲成人网在线观看| 亚洲欧洲日产国码在线观看| 亚洲一区二区三区国产精品无码| ASS亚洲熟妇毛茸茸PICS| 亚洲精品无码av中文字幕| 爱情岛论坛亚洲品质自拍视频网站 | 亚洲国产成人精品无码区花野真一| 亚洲精品成a人在线观看夫| 疯狂做受xxxx高潮视频免费| 国产一级一毛免费黄片| 91免费人成网站在线观看18| 大学生美女毛片免费视频| xvideos亚洲永久网址| 亚洲永久无码3D动漫一区| 亚洲自偷自拍另类图片二区| 色偷偷亚洲女人天堂观看欧| 国产精品亚洲综合| 久久久久久免费一区二区三区 | 国产成人久久精品亚洲小说| 不卡视频免费在线观看| 四虎成年永久免费网站| 波多野结衣视频在线免费观看| 亚洲av永久无码精品网站|