精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

實現異步編程,這個工具類你得掌握!

開發 開發工具
在日常的Java8項目開發中,CompletableFuture是很強大的并行開發工具,其語法貼近java8的語法風格,與stream一起使用也能大大增加代碼的簡潔性。

 [[393773]]

本文轉載自微信公眾號「月伴飛魚」,作者日常加油站。轉載本文請聯系月伴飛魚公眾號。   

前言

最近看公司代碼,多線程編程用的比較多,其中有對CompletableFuture的使用,所以想寫篇文章總結下

在日常的Java8項目開發中,CompletableFuture是很強大的并行開發工具,其語法貼近java8的語法風格,與stream一起使用也能大大增加代碼的簡潔性

大家可以多應用到工作中,提升接口性能,優化代碼

基本介紹

CompletableFuture是Java 8新增的一個類,用于異步編程,繼承了Future和CompletionStage

這個Future主要具備對請求結果獨立處理的功能,CompletionStage用于實現流式處理,實現異步請求的各個階段組合或鏈式處理,因此completableFuture能實現整個異步調用接口的扁平化和流式處理,解決原有Future處理一系列鏈式異步請求時的復雜編碼

Future的局限性

1、Future 的結果在非阻塞的情況下,不能執行更進一步的操作

我們知道,使用Future時只能通過isDone()方法判斷任務是否完成,或者通過get()方法阻塞線程等待結果返回,它不能非阻塞的情況下,執行更進一步的操作。

2、不能組合多個Future的結果

假設你有多個Future異步任務,你希望最快的任務執行完時,或者所有任務都執行完后,進行一些其他操作

3、多個Future不能組成鏈式調用

當異步任務之間有依賴關系時,Future不能將一個任務的結果傳給另一個異步任務,多個Future無法創建鏈式的工作流。

4、沒有異常處理

現在使用CompletableFuture能幫助我們完成上面的事情,讓我們編寫更強大、更優雅的異步程序

基本使用

創建異步任務

通常可以使用下面幾個CompletableFuture的靜態方法創建一個異步任務

  1. public static CompletableFuture<Void> runAsync(Runnable runnable);              //創建無返回值的異步任務 
  2. public static CompletableFuture<Void> runAsync(Runnable runnable, Executor executor);     //無返回值,可指定線程池(默認使用ForkJoinPool.commonPool) 
  3. public static <U> CompletableFuture<U> supplyAsync(Supplier<U> supplier);           //創建有返回值的異步任務 
  4. public static <U> CompletableFuture<U> supplyAsync(Supplier<U> supplier, Executor executor); //有返回值,可指定線程池 

使用示例:

  1. Executor executor = Executors.newFixedThreadPool(10); 
  2. CompletableFuture<Void> future = CompletableFuture.runAsync(() -> { 
  3.     //do something 
  4. }, executor); 
  5. int poiId = 111; 
  6. CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> { 
  7.  PoiDTO poi = poiService.loadById(poiId); 
  8.   return poi.getName(); 
  9. }); 
  10. // Block and get the result of the Future 
  11. String poiName = future.get(); 

使用回調方法

通過future.get()方法獲取異步任務的結果,還是會阻塞的等待任務完成

CompletableFuture提供了幾個回調方法,可以不阻塞主線程,在異步任務完成后自動執行回調方法中的代碼

  1. public CompletableFuture<Void> thenRun(Runnable runnable);            //無參數、無返回值 
  2. public CompletableFuture<Void> thenAccept(Consumer<? super T> action);         //接受參數,無返回值 
  3. public <U> CompletableFuture<U> thenApply(Function<? super T,? extends U> fn); //接受參數T,有返回值U 

使用示例:

  1. CompletableFuture<Void> future = CompletableFuture.supplyAsync(() -> "Hello"
  2.                            .thenRun(() -> System.out.println("do other things. 比如異步打印日志或發送消息")); 
  3. //如果只想在一個CompletableFuture任務執行完后,進行一些后續的處理,不需要返回值,那么可以用thenRun回調方法來完成。 
  4. //如果主線程不依賴thenRun中的代碼執行完成,也不需要使用get()方法阻塞主線程。 
  1. CompletableFuture<Void> future = CompletableFuture.supplyAsync(() -> "Hello"
  2.                            .thenAccept((s) -> System.out.println(s + " world")); 
  3. //輸出:Hello world 
  4. //回調方法希望使用異步任務的結果,并不需要返回值,那么可以使用thenAccept方法 
  1. CompletableFuture<Boolean> future = CompletableFuture.supplyAsync(() -> { 
  2.   PoiDTO poi = poiService.loadById(poiId); 
  3.   return poi.getMainCategory(); 
  4. }).thenApply((s) -> isMainPoi(s));   // boolean isMainPoi(int poiId); 
  5.  
  6. future.get(); 
  7. //希望將異步任務的結果做進一步處理,并需要返回值,則使用thenApply方法。 
  8. //如果主線程要獲取回調方法的返回,還是要用get()方法阻塞得到 

組合兩個異步任務

  1. //thenCompose方法中的異步任務依賴調用該方法的異步任務 
  2. public <U> CompletableFuture<U> thenCompose(Function<? super T, ? extends CompletionStage<U>> fn);  
  3. //用于兩個獨立的異步任務都完成的時候 
  4. public <U,V> CompletableFuture<V> thenCombine(CompletionStage<? extends U> other,  
  5.                                               BiFunction<? super T,? super U,? extends V> fn);  

使用示例:

  1. CompletableFuture<List<Integer>> poiFuture = CompletableFuture.supplyAsync( 
  2.   () -> poiService.queryPoiIds(cityId, poiId) 
  3. ); 
  4. //第二個任務是返回CompletableFuture的異步方法 
  5. CompletableFuture<List<DealGroupDTO>> getDeal(List<Integer> poiIds){ 
  6.   return CompletableFuture.supplyAsync(() ->  poiService.queryPoiIds(poiIds)); 
  7. //thenCompose 
  8. CompletableFuture<List<DealGroupDTO>> resultFuture = poiFuture.thenCompose(poiIds -> getDeal(poiIds)); 
  9. resultFuture.get(); 

thenCompose和thenApply的功能類似,兩者區別在于thenCompose接受一個返回CompletableFuture的Function,當想從回調方法返回的CompletableFuture中直接獲取結果U時,就用thenCompose

如果使用thenApply,返回結果resultFuture的類型是CompletableFuture>>,而不是CompletableFuture>

  1. CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> "Hello"
  2.   .thenCombine(CompletableFuture.supplyAsync(() -> "world"), (s1, s2) -> s1 + s2); 
  3. //future.get() 

組合多個CompletableFuture

當需要多個異步任務都完成時,再進行后續處理,可以使用allOf方法

  1. CompletableFuture<Void> poiIDTOFuture = CompletableFuture 
  2.  .supplyAsync(() -> poiService.loadPoi(poiId)) 
  3.   .thenAccept(poi -> { 
  4.     model.setModelTitle(poi.getShopName()); 
  5.     //do more thing 
  6.   }); 
  7.  
  8. CompletableFuture<Void> productFuture = CompletableFuture 
  9.  .supplyAsync(() -> productService.findAllByPoiIdOrderByUpdateTimeDesc(poiId)) 
  10.   .thenAccept(list -> { 
  11.     model.setDefaultCount(list.size()); 
  12.     model.setMoreDesc("more"); 
  13.   }); 
  14. //future3等更多異步任務,這里就不一一寫出來了 
  15.  
  16. CompletableFuture.allOf(poiIDTOFuture, productFuture, future3, ...).join();  //allOf組合所有異步任務,并使用join獲取結果 

該方法挺適合C端的業務,比如通過poiId異步的從多個服務拿門店信息,然后組裝成自己需要的模型,最后所有門店信息都填充完后返回

這里使用了join方法獲取結果,它和get方法一樣阻塞的等待任務完成

多個異步任務有任意一個完成時就返回結果,可以使用anyOf方法

  1. CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> { 
  2.     try { 
  3.         TimeUnit.SECONDS.sleep(2); 
  4.     } catch (InterruptedException e) { 
  5.        throw new IllegalStateException(e); 
  6.     } 
  7.     return "Result of Future 1"
  8. }); 
  9.  
  10. CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> { 
  11.     try { 
  12.         TimeUnit.SECONDS.sleep(1); 
  13.     } catch (InterruptedException e) { 
  14.        throw new IllegalStateException(e); 
  15.     } 
  16.     return "Result of Future 2"
  17. }); 
  18.  
  19. CompletableFuture<String> future3 = CompletableFuture.supplyAsync(() -> { 
  20.     try { 
  21.         TimeUnit.SECONDS.sleep(3); 
  22.     } catch (InterruptedException e) { 
  23.        throw new IllegalStateException(e); 
  24.       return "Result of Future 3"
  25. }); 
  26.  
  27. CompletableFuture<Object> anyOfFuture = CompletableFuture.anyOf(future1, future2, future3); 
  28.  
  29. System.out.println(anyOfFuture.get()); // Result of Future 2 

異常處理

  1. Integer age = -1; 
  2.  
  3. CompletableFuture<Void> maturityFuture = CompletableFuture.supplyAsync(() -> { 
  4.   if(age < 0) { 
  5.     throw new IllegalArgumentException("Age can not be negative"); 
  6.   } 
  7.   if(age > 18) { 
  8.     return "Adult"
  9.   } else { 
  10.     return "Child"
  11.   } 
  12. }).exceptionally(ex -> { 
  13.   System.out.println("Oops! We have an exception - " + ex.getMessage()); 
  14.   return "Unknown!"
  15. }).thenAccept(s -> System.out.print(s)); 
  16. //Unkown! 

exceptionally方法可以處理異步任務的異常,在出現異常時,給異步任務鏈一個從錯誤中恢復的機會,可以在這里記錄異常或返回一個默認值

使用handler方法也可以處理異常,并且無論是否發生異常它都會被調用

  1. Integer age = -1; 
  2.  
  3. CompletableFuture<String> maturityFuture = CompletableFuture.supplyAsync(() -> { 
  4.     if(age < 0) { 
  5.         throw new IllegalArgumentException("Age can not be negative"); 
  6.     } 
  7.     if(age > 18) { 
  8.         return "Adult"
  9.     } else { 
  10.         return "Child"
  11.     } 
  12. }).handle((res, ex) -> { 
  13.     if(ex != null) { 
  14.         System.out.println("Oops! We have an exception - " + ex.getMessage()); 
  15.         return "Unknown!"
  16.     } 
  17.     return res; 
  18. }); 

分片處理

分片和并行處理:分片借助stream實現,然后通過CompletableFuture實現并行執行,最后做數據聚合(其實也是stream的方法)

CompletableFuture并不提供單獨的分片api,但可以借助stream的分片聚合功能實現

舉個例子:

 

  1. //請求商品數量過多時,做分批異步處理 
  2. List<List<Long>> skuBaseIdsList = ListUtils.partition(skuIdList, 10);//分片 
  3. //并行 
  4. List<CompletableFuture<List<SkuSales>>> futureList = Lists.newArrayList(); 
  5. for (List<Long> skuId : skuBaseIdsList) { 
  6.   CompletableFuture<List<SkuSales>> tmpFuture = getSkuSales(skuId); 
  7.   futureList.add(tmpFuture); 
  8. //聚合 
  9. futureList.stream().map(CompletalbleFuture::join).collent(Collectors.toList()); 

舉個例子

帶大家領略下CompletableFuture異步編程的優勢

這里我們用CompletableFuture實現水泡茶程序

首先還是需要先完成分工方案,在下面的程序中,我們分了3個任務:

  • 任務1負責洗水壺、燒開水
  • 任務2負責洗茶壺、洗茶杯和拿茶葉
  • 任務3負責泡茶。其中任務3要等待任務1和任務2都完成后才能開始

下面是代碼實現,你先略過runAsync()、supplyAsync()、thenCombine()這些不太熟悉的方法,從大局上看,你會發現:

  • 無需手工維護線程,沒有繁瑣的手工維護線程的工作,給任務分配線程的工作也不需要我們關注;
  • 語義更清晰,例如 f3 = f1.thenCombine(f2, ()->{}) 能夠清晰地表述任務3要等待任務1和任務2都完成后才能開始;
  • 代碼更簡練并且專注于業務邏輯,幾乎所有代碼都是業務邏輯相關的
  1. //任務1:洗水壺->燒開水 
  2. CompletableFuture f1 =  
  3.   CompletableFuture.runAsync(()->{ 
  4.   System.out.println("T1:洗水壺..."); 
  5.   sleep(1, TimeUnit.SECONDS); 
  6.  
  7.   System.out.println("T1:燒開水..."); 
  8.   sleep(15, TimeUnit.SECONDS); 
  9. }); 
  10. //任務2:洗茶壺->洗茶杯->拿茶葉 
  11. CompletableFuture f2 =  
  12.   CompletableFuture.supplyAsync(()->{ 
  13.   System.out.println("T2:洗茶壺..."); 
  14.   sleep(1, TimeUnit.SECONDS); 
  15.  
  16.   System.out.println("T2:洗茶杯..."); 
  17.   sleep(2, TimeUnit.SECONDS); 
  18.  
  19.   System.out.println("T2:拿茶葉..."); 
  20.   sleep(1, TimeUnit.SECONDS); 
  21.   return "龍井"
  22. }); 
  23. //任務3:任務1和任務2完成后執行:泡茶 
  24. CompletableFuture f3 =  
  25.   f1.thenCombine(f2, (__, tf)->{ 
  26.     System.out.println("T1:拿到茶葉:" + tf); 
  27.     System.out.println("T1:泡茶..."); 
  28.     return "上茶:" + tf; 
  29.   }); 
  30. //等待任務3執行結果 
  31. System.out.println(f3.join()); 
  32.  
  33. void sleep(int t, TimeUnit u) { 
  34.   try { 
  35.     u.sleep(t); 
  36.   }catch(InterruptedException e){} 

注意事項

1.CompletableFuture默認線程池是否滿足使用

前面提到創建CompletableFuture異步任務的靜態方法runAsync和supplyAsync等,可以指定使用的線程池,不指定則用CompletableFuture的默認線程池

  1. private static final Executor asyncPool = useCommonPool ? 
  2.         ForkJoinPool.commonPool() : new ThreadPerTaskExecutor(); 

可以看到,CompletableFuture默認線程池是調用ForkJoinPool的commonPool()方法創建,這個默認線程池的核心線程數量根據CPU核數而定,公式為Runtime.getRuntime().availableProcessors() - 1,以4核雙槽CPU為例,核心線程數量就是4*2-1=7個

這樣的設置滿足CPU密集型的應用,但對于業務都是IO密集型的應用來說,是有風險的,當qps較高時,線程數量可能就設的太少了,會導致線上故障

所以可以根據業務情況自定義線程池使用

 

2.get設置超時時間不能串行get,不然會導致接口延時線程數量*超時時間

 

責任編輯:武曉燕 來源: 月伴飛魚
相關推薦

2022-03-03 08:30:41

GeneratorES6函數

2025-05-14 00:01:10

RxJS異步編程響應式

2019-12-31 14:10:58

Excel文章SQL

2022-10-24 07:31:53

Python編程裝飾器

2024-04-30 11:11:33

aiohttp模塊編程

2013-04-01 15:38:54

異步編程異步編程模型

2025-07-03 02:00:00

2024-04-01 09:45:50

TAP模式.NET異步編程

2024-03-15 08:23:26

異步編程函數

2021-05-07 16:19:36

異步編程Java線程

2024-11-08 09:48:38

異步編程I/O密集

2023-07-06 08:31:50

Python對象編程

2025-05-19 09:30:42

FastAPI接口代碼

2020-03-29 08:27:05

Promise異步編程前端

2023-11-24 16:13:05

C++編程

2019-04-30 15:10:42

Python調試工具編程語言

2011-02-24 12:53:51

.NET異步傳統

2023-09-18 07:46:28

2020-10-27 10:58:07

Linux內核操作系統

2022-01-25 12:41:31

ChromeResponse接口
點贊
收藏

51CTO技術棧公眾號

日本一区二区视频在线播放| 欧美日韩一区二区在线免费观看 | 日韩亚洲欧美在线| 99久久免费观看| 蜜桃免费在线| 韩国一区二区在线观看| 欧美激情一区二区久久久| 偷拍夫妻性生活| 精品视频一区二区三区在线观看| 欧美日韩激情小视频| 一区二区三区国| 天天操天天干天天插| 美女视频黄频大全不卡视频在线播放| 欧美激情国产精品| 2019男人天堂| 人人网欧美视频| 欧美一区二区三区小说| 欧美少妇性生活视频| 日本资源在线| 亚洲视频一二区| 蜜桃视频成人| 国产刺激高潮av| 狠狠狠色丁香婷婷综合激情| 日本成熟性欧美| 国产精品50页| 在线观看国产精品入口| 亚洲最新av网址| 国产白嫩美女无套久久| 日韩中文字幕一区二区高清99| 日韩欧美国产成人| 分分操这里只有精品| 婷婷在线视频| 国产精品人成在线观看免费| 欧美人与性禽动交精品| 免费国产黄色片| 国产一区二区不卡在线| 国产原创欧美精品| 精品久久久久久久久久久国产字幕| 欧美日韩国产一区精品一区| 日日噜噜噜夜夜爽亚洲精品 | 日韩免费在线免费观看| 亚洲精品1区2区3区| 伊人成人在线| 欧美激情网友自拍| 国产极品国产极品| 欧美激情欧美| 日韩一区av在线| 久久免费手机视频| 奇米影视亚洲| 在线日韩av观看| 大吊一区二区三区| 欧美中文一区二区| 日韩亚洲国产中文字幕| 影音先锋男人看片资源| 欧美成免费一区二区视频| 色噜噜久久综合伊人一本| 中文字幕黄色网址| 久久影院一区| 久久综合国产精品台湾中文娱乐网| 国产3级在线观看| 国产大片一区| 欧美成人精品不卡视频在线观看| 亚洲国产精品久| 欧美日本一区| 性欧美激情精品| 男女啊啊啊视频| 欧美一级视频| 国产精品高潮呻吟久久av野狼 | 在线观看的黄色| 色婷婷久久久亚洲一区二区三区| 久章草在线视频| 色综合天天色| 欧美一区二区三区喷汁尤物| 亚洲一区二区图片| 超碰成人免费| 亚洲欧美精品在线| 国产无遮挡在线观看| 外国成人免费视频| 欧美激情视频网| 久久精品国产成人av| 日韩精品欧美精品| 91免费视频国产| 日韩一级在线播放| 日本一区二区三区在线不卡| 一区二区三区国产福利| 高清电影在线免费观看| 狠狠躁夜夜躁人人爽超碰91 | 国产一区二区按摩在线观看| 99久久无色码| 国产在线黄色| 亚洲男女一区二区三区| av免费观看网| 4438五月综合| 日韩av影视综合网| 呻吟揉丰满对白91乃国产区| 伊人激情综合| 国产精品久久久久久久av大片| 国产乱码久久久| 97精品久久久午夜一区二区三区 | 欧洲不卡av| 亚洲午夜激情av| 欧美一级黄色影院| 一区二区三区亚洲变态调教大结局 | 国产永久免费高清在线观看视频| 亚洲图片你懂的| 国产中文字幕视频在线观看| 祥仔av免费一区二区三区四区| 亚洲国产一区二区三区在线观看| 性生交大片免费全黄| 日韩午夜一区| 97超碰人人看人人| 国产视频精选在线| 激情成人在线视频| 日本77777| 精品久久久亚洲| 97婷婷大伊香蕉精品视频| 国产免费av电影| 国产亚洲欧美日韩日本| 成人午夜视频在线观看免费| 亚洲精品777| 影音先锋日韩有码| www.国产毛片| 91老师国产黑色丝袜在线| av一区二区三区免费观看| 亚洲免费资源| 中文字幕精品在线视频| 久久人妻免费视频| 99久久精品国产一区二区三区| 黄色成人在线免费观看| 精品三级国产| 伦理中文字幕亚洲| 国产免费黄色片| 中文字幕一区二区三区av| 欧美日韩大尺度| 亚洲v天堂v手机在线| 午夜免费在线观看精品视频| 欧美一区二不卡视频| 一区二区三区不卡在线观看| 在线一区二区不卡| 婷婷综合久久| 亚洲在线视频观看| www免费视频观看在线| 欧美精品在线观看一区二区| 国产日韩精品中文字无码| 秋霞国产午夜精品免费视频| 日本一区二区三区在线视频| 激情都市亚洲| 国产午夜精品一区理论片飘花| 久久国产精品系列| 久久影院午夜论| aⅴ在线免费观看| 最新国产一区| 国产精品第2页| jizzjizz在线观看| 欧美日本一区二区三区四区| 国产极品美女在线| 狠狠色丁香久久婷婷综| 国内自拍中文字幕| 国产另类在线| 国产91|九色| av色图一区| 在线电影一区二区三区| 欧美爱爱小视频| 99久久综合色| 少妇性l交大片| 欧美激情黄色片| 99免费在线视频观看| 国产一二三在线| 亚洲丝袜av一区| 亚洲在线精品视频| 亚洲精品视频免费观看| 国产精品久久久久久亚洲av| 视频一区在线播放| 亚洲欧美日产图| 综合激情网...| 欧洲亚洲女同hd| 在线观看麻豆| 精品盗摄一区二区三区| 91porny九色| 亚洲精品国产一区二区精华液 | 日本在线一二三| 欧美唯美清纯偷拍| 久久成人国产精品入口| 久久久久国产精品免费免费搜索| 天天干天天爽天天射| 极品少妇一区二区三区| 欧洲在线视频一区| 亚洲精品黑牛一区二区三区| 日本久久91av| 欧美性爽视频| 亚洲色图欧美制服丝袜另类第一页| 一二三区中文字幕| 欧美日韩国产综合新一区| 日本黄色片免费观看| 99re这里只有精品视频首页| 男生操女生视频在线观看| 亚洲精品123区| 热这里只有精品| 五月天亚洲一区| 69堂成人精品视频免费| 综合日韩av| 欧美精品18videos性欧| av网在线观看| 亚洲欧美中文日韩在线| 国产婷婷在线视频| 欧美在线观看视频一区二区 | 精品视频一区二区不卡| 久久草视频在线| 亚洲精品欧美专区| 亚洲国产日韩一区无码精品久久久| 国产福利一区在线观看| 在线免费观看av的网站| 亚洲欧美久久久| 又大又硬又爽免费视频| 国产精品毛片一区二区在线看| 玛丽玛丽电影原版免费观看1977| 欧美成年网站| 国产日韩欧美在线播放| 亚洲校园激情春色| 久久久久久久久综合| 国产原创精品视频| 综合网日日天干夜夜久久| 免费动漫网站在线观看| 日韩精品高清在线| 日韩一级片免费看| 日韩欧美国产1| 91久久精品国产91性色69| 日本乱码高清不卡字幕| 好看的av在线| 天天综合网天天综合色| 久久久精品国产sm调教| 亚洲精品欧美在线| 黄色片在线观看网站| 国产精品久久久久久久久免费相片 | 亚洲人成网亚洲欧洲无码| 国产精品对白一区二区三区| 日本一区二区三区电影免费观看| 国产精品直播网红| www.26天天久久天堂| 国产成人精品视频| 欧美人与性动交xxⅹxx| 日本成人在线视频网址| 久久uomeier| 国产成人精品免高潮费视频| 日本精品另类| 国产精品日韩在线| 国产精品伊人| 成人激情在线播放| 久久在线观看| 成人综合电影| 日韩大片在线免费观看| 久久久精品有限公司| 亚洲裸色大胆大尺寸艺术写真| 国产精品一区二区av白丝下载 | 一二三av在线| 久久66热re国产| 91热视频在线观看| 国产高清在线精品| 无码人妻一区二区三区在线| av资源站一区| 国产精品亚洲无码| 日本一区二区视频在线观看| 青青草原国产免费| 成人高清av| 中文字幕一区二区三区有限公司| 91精品亚洲| 奇米777四色影视在线看| 激情婷婷亚洲| 日韩免费一级视频| 日韩专区欧美专区| 91精品999| 粉嫩av亚洲一区二区图片| 一区二区不卡免费视频| 久久久一区二区三区捆绑**| 农村老熟妇乱子伦视频| 亚洲精品写真福利| 日韩中文字幕在线观看视频| 欧美体内she精视频| 精品国产黄色片| 日韩高清中文字幕| av一区在线观看| 欧美大码xxxx| 电影一区二区三区| 国产视频观看一区| 狠狠一区二区三区| 日韩国产一区久久| 欧美涩涩视频| 中文字幕在线观看第三页| 国产一区二区不卡| 精品国产av无码| 一区二区三区日韩在线观看| 国产区一区二区三| 337p亚洲精品色噜噜噜| 五月婷婷综合久久| 久久在线免费观看视频| 中文不卡1区2区3区| 91精品久久久久久久久久另类| 999久久精品| 亚洲欧美日韩在线综合| 国产亚洲网站| 激情图片中文字幕| 国产午夜精品久久| 亚洲国产精品午夜在线观看| 欧美日韩你懂得| 亚洲AV成人无码一二三区在线| 日韩一区二区三区xxxx| 综合另类专区| 成人av男人的天堂| 亚洲国产不卡| 日本爱爱免费视频| 99九九99九九九视频精品| 午夜69成人做爰视频| 精品视频一区三区九区| 久久久久国产精品嫩草影院| 欧美国产日韩免费| 欧美综合影院| 日韩成人在线资源| 国产欧美三级| 先锋资源av在线| 亚洲一区二区三区免费视频| 99精品人妻无码专区在线视频区| 亚洲无线码在线一区观看| 九九精品调教| 亚洲伊人第一页| 91视频综合| www.精品在线| 国产亚洲午夜高清国产拍精品| 国产精品成人网站| 日韩女优毛片在线| 黄色网页在线免费观看| 国产精品入口夜色视频大尺度 | 亚洲视频在线观看视频| 精品91久久| 欧洲亚洲一区二区三区四区五区| 国产精品久久久亚洲一区| 人妖粗暴刺激videos呻吟| 亚洲第一综合色| 日韩一区免费视频| 97碰在线观看| 日韩精品福利一区二区三区| 精品少妇在线视频| 成人激情动漫在线观看| 国产网站在线看| 亚洲国产精品美女| 三妻四妾的电影电视剧在线观看| 国产综合av一区二区三区| 亚洲国产国产亚洲一二三 | 久久精品一区二区| 日本一区二区三区精品| 亚洲剧情一区二区| 91精品韩国| 日本最新一区二区三区视频观看| 视频一区视频二区中文字幕| jizz日本在线播放| 欧美一级搡bbbb搡bbbb| 影音先锋中文在线视频| 国产精品国产精品| 国产精品日本| 性欧美精品中出| 欧美福利电影网| 怡红院av在线| 黄色一区三区| 日韩成人免费电影| 亚洲精品电影院| 欧美成人精精品一区二区频| av资源一区| 日本高清一区| 久久爱www久久做| 久久国产在线观看| 国产视频亚洲精品| 久久电影天堂| 992tv成人免费观看| 懂色av一区二区三区免费观看 | 蜜桃av.com| 精品卡一卡二卡三卡四在线| 亚洲精品福利电影| 亚洲午夜精品一区二区三区| 国产在线观看一区二区| 福利一区二区三区四区| 最好看的2019的中文字幕视频| 亚洲三区欧美一区国产二区| 无码精品a∨在线观看中文| 国产精品三级电影| 日本黄色免费视频| 国产精品中文字幕久久久| 在线成人av| 欧美人与禽zoz0善交| 欧美精品一区视频| 国产成人午夜性a一级毛片| 日本大片免费看| 亚洲国产精品成人综合色在线婷婷| www.av黄色| 国产精品欧美日韩| 在线国产精品一区| 国产wwwwxxxx| 亚洲美女在线观看| 中文字幕一区日韩精品 | 美女又爽又黄免费视频| 久久在精品线影院精品国产| 亚洲亚洲免费|