精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

在线观看视频91| 国产精品三级在线观看| 欧美亚洲国产成人精品| 在线观看国产精品一区| 亚洲老司机网| 亚洲福利一二三区| 亚洲精品乱码久久久久久蜜桃91| 精品国产一级片| 久久性天堂网| 欧美激情精品久久久久久黑人| 蜜桃精品一区二区| 欧洲大片精品免费永久看nba| 岛国av午夜精品| 国产成人三级视频| 天堂资源中文在线| 国产精品自拍网站| 国产精品高潮在线| 日韩精品视频免费播放| 欧美好骚综合网| 亚洲精品成a人在线观看| 在线播放免费视频| 欧美日韩五码| 黄色成人av在线| 欧美交换配乱吟粗大25p| 国产乱视频在线观看| 成人高清在线视频| 91影院在线免费观看视频| 无码人妻精品一区二区50| 亚洲激情综合| 欧美激情中文网| 女性裸体视频网站| 国产剧情一区| 亚洲精品一二区| 插我舔内射18免费视频| 亚洲专区**| 91精品国产乱| 久久久久久综合网| av一区在线| 日本韩国一区二区| 丰满少妇被猛烈进入高清播放| 精灵使的剑舞无删减版在线观看| 中文字幕在线不卡一区| 亚洲欧洲日本国产| 91亚洲欧美| 中文字幕精品在线不卡| 天堂√在线观看一区二区| 亚洲三区在线观看无套内射| 高清av一区二区| 91视频最新| www久久久com| 国产凹凸在线观看一区二区| 91综合免费在线| 国产999久久久| 国产成人av影院| 超碰97在线人人| 亚洲国产成人精品一区二区三区| 国产精品一二二区| 国产精品成人观看视频免费| 亚洲精品人妻无码| 成人免费电影视频| 国产一区不卡在线观看| 午夜在线视频免费| 久久精品在线观看| 一区二区视频在线播放| 久久精品视频观看| 亚洲精品乱码久久久久久久久| 神马午夜伦理影院| 女同一区二区免费aⅴ| 亚洲狠狠爱一区二区三区| 国产精品久久..4399| 福利影院在线看| 一本色道亚洲精品aⅴ| 国产精品视频黄色| 婷婷激情成人| 欧美大胆人体bbbb| 国产精品毛片一区二区| jvid福利在线一区二区| 美女扒开尿口让男人操亚洲视频网站| 成熟的女同志hd| 精品福利av| 国产精品大陆在线观看| 国产乱人乱偷精品视频| 成人精品视频一区| 欧洲精品久久| а√资源新版在线天堂| 午夜精品久久久久久久 | 亚洲一区二区三区高清| 国产精品jvid在线观看蜜臀| 国产精品久久久久久在线| eeuss国产一区二区三区 | 熟妇高潮一区二区| 欧美一区二区三区激情视频| 久久影视免费观看| 丁香六月婷婷综合| 国产精一品亚洲二区在线视频| 精品国产日本| 精品国产白色丝袜高跟鞋| 精品久久中文字幕| www,av在线| 国产一区二区三区不卡视频网站| 蜜臀久久99精品久久久无需会员 | 欧美性猛交xxxx乱| 国自产拍偷拍福利精品免费一| 日本老师69xxx| www.桃色av嫩草.com| 久久九九久精品国产免费直播| 99久re热视频精品98| 高清电影一区| 亚洲福利视频在线| 538精品在线观看| 日韩福利视频导航| 精品乱子伦一区二区三区| 国产区在线看| 欧美丝袜丝交足nylons图片| 成人免费无码大片a毛片| 一区二区蜜桃| 国产精品网红直播| 国产中文在线观看| 欧美日韩国产精品| 国产精久久久久| 99久久综合| 国产精品一区二区久久久| 午夜小视频在线播放| 亚洲一区二区三区视频在线 | 久久久欧美精品sm网站| 日本黄大片在线观看| 成人国产精品久久| 深夜精品寂寞黄网站在线观看| 久久国产视频一区| 99久久伊人精品| 国产精品va在线观看无码| 一区二区三区无毛| 日韩中文字幕视频在线| 久久久久久无码精品大片| 91丨porny丨最新| 日韩一级片免费视频| 亚洲一二三区视频| 欧美—级a级欧美特级ar全黄 | 激情五月激情综合网| 日韩免费电影一区二区三区| 一区二区三区短视频| 亚洲国产精品嫩草影院久久| 久久久久性色av无码一区二区| 国产另类ts人妖一区二区| 久久久成人精品一区二区三区 | 黑人玩欧美人三根一起进| 欧美一区二区网站| 亚洲成人生活片| 国产一区二区在线视频| 喜爱夜蒲2在线| 日韩精品一区国产| 久久久中精品2020中文| 人妻视频一区二区三区| 天天影视网天天综合色在线播放| 日本少妇xxxx| 美女久久网站| 亚洲mv在线看| 精品午夜视频| 久久久久国产精品免费| 污污视频在线免费看| 欧美日韩亚洲成人| 精品伦精品一区二区三区视频密桃| 蜜臀a∨国产成人精品| 免费成人进口网站| 福利片在线一区二区| 欧美一区二区三区精品电影| 国产小视频免费在线观看| 欧美浪妇xxxx高跟鞋交| www.av视频| 99精品桃花视频在线观看| 情侣黄网站免费看| 成人在线电影在线观看视频| 国产综合视频在线观看| ****av在线网毛片| 国产一区二区三区在线看| 97在线视频人妻无码| 亚洲一级二级三级| 久久精品视频18| 韩国三级中文字幕hd久久精品| 国内外成人激情免费视频| 精品午夜电影| 国产精品三级在线| 激情图片在线观看高清国产| 日韩精品免费在线视频观看| 伊人精品在线视频| 亚洲国产精品一区二区久久恐怖片| 欧美深性狂猛ⅹxxx深喉| 久久精品久久综合| 国产高清av在线播放| 欧美亚洲国产精品久久| 国产成人精品自拍| 国产麻豆久久| 久久久久一本一区二区青青蜜月| 精品av中文字幕在线毛片| 日韩你懂的在线播放| 一级成人黄色片| 亚洲综合激情小说| 纪美影视在线观看电视版使用方法| 国产精品综合在线视频| www日韩视频| 一区二区亚洲精品| 大地资源第二页在线观看高清版| 丝袜连裤袜欧美激情日韩| 91在线高清免费观看| 午夜日韩成人影院| 久久全球大尺度高清视频| 在线观看美女网站大全免费| 精品福利在线导航| 国产麻豆精品一区| 欧美中文字幕一区二区三区亚洲| 国产一级一级片| 亚洲欧美视频一区| 亚洲色图 激情小说| 91美女片黄在线观看91美女| 午夜视频在线免费看| 麻豆91精品91久久久的内涵| 能在线观看的av| 亚洲另类视频| 久久久99精品视频| 亚洲国产一区二区三区在线播放| 日本不卡免费新一二三区| 国产另类在线| 91精品国产综合久久久久久丝袜| 成人全视频在线观看在线播放高清 | 亚洲女人av| 免费看黄在线看| 国精品一区二区三区| 视色,视色影院,视色影库,视色网| 日韩电影免费网址| 手机成人在线| 成人aaaa| 亚洲国产精品日韩| 欧美一二区在线观看| 日韩一区二区电影在线观看| 亚洲综合图色| 欧美精品二区三区四区免费看视频| 久久久久97| 精品国产二区在线| 欧美美女啪啪| 欧美一级日本a级v片| 美女网站一区| 另类欧美小说| 久久不见久久见免费视频7| 久久99精品久久久久久秒播放器 | 成人免费视频毛片| 亚洲r级在线视频| 99热国产在线观看| 欧美日韩国产丝袜另类| 五月婷婷激情视频| 在线免费一区三区| 怡春院在线视频| 欧美高清激情brazzers| 国产三级按摩推拿按摩| 日韩欧美中文字幕精品| 亚洲精品久久久久久久久久久久久久 | jiujiure精品视频播放| 亚洲欧美日韩在线综合| 91精品精品| 欧美中日韩在线| 亚洲一区图片| 99热手机在线| 国产麻豆成人精品| 国产十八熟妇av成人一区| 99久久婷婷国产综合精品电影| 免费a级黄色片| 国产精品亲子乱子伦xxxx裸| 婷婷社区五月天| 亚洲国产美女搞黄色| 日本免费在线观看视频| 欧美日韩一区在线| 亚洲AV无码精品色毛片浪潮| 日韩av一区在线观看| 国外av在线| 久久的精品视频| ****av在线网毛片| 国产精品看片资源| 视频一区在线| 日韩影片在线播放| 欧美一区视频| 日韩视频在线免费看| 久久99最新地址| 一级黄色片毛片| 国产日韩欧美电影| 欧美黑人猛猛猛| 色综合天天性综合| 国产精品久久久久久久久久久久久久久久久久| 精品女同一区二区| 黄网站在线观看| 久久91超碰青草是什么| 电影一区二区三| 96久久精品| 精品国产一区二区三区久久久蜜臀 | 色偷偷中文字幕| 久久日韩粉嫩一区二区三区 | 婷婷六月综合亚洲| 国产人妖一区二区| 亚洲无av在线中文字幕| 欧美黑人猛交| 国产欧美va欧美va香蕉在线| 免费萌白酱国产一区二区三区| 亚洲精品tv久久久久久久久| 伊人久久亚洲影院| 国产三级精品三级在线| 久久久久久99精品| 久久综合亚洲色hezyo国产| 欧美中文字幕一二三区视频| 天堂中文网在线| 不卡av在线播放| 91福利精品在线观看| 久久国产精品高清| 国内成人在线| 欧美日韩精品区别| 日本一区二区在线不卡| 奇米影视第四色777| 日韩欧美你懂的| 国产秀色在线www免费观看| 国产精品69久久| 五月综合久久| 精品久久一二三| 国产九九视频一区二区三区| 顶级黑人搡bbw搡bbbb搡| 欧洲精品一区二区| 久草视频视频在线播放| 亚州精品天堂中文字幕| 91综合精品国产丝袜长腿久久| 国产成人精品免费看在线播放| 老司机精品福利视频| 国产精品无码一区二区三区免费| 亚洲永久精品大片| 亚洲福利在线观看视频| 欧美情侣性视频| 国产精品亚洲四区在线观看| 综合视频免费看| 久久国产三级精品| www.xx日本| 欧美日韩高清一区二区三区| 成全电影播放在线观看国语| 日本一区二区在线免费播放| 秋霞影视一区二区三区| 男人天堂999| 国产亚洲欧美激情| 中文字幕男人天堂| 日韩天堂在线视频| 久久久久九九精品影院| 国产内射老熟女aaaa| 国产高清视频一区| 久久久久久福利| 亚洲成人xxx| 中文字幕在线高清| 日韩免费av电影| 久久99精品久久久| 麻豆一区产品精品蜜桃的特点| 日韩精品中午字幕| bl视频在线免费观看| 美女三级99| 日日夜夜免费精品| 激情无码人妻又粗又大| 91精品国产综合久久久久久久久久 | 国产亚洲精品超碰| 怡红院男人天堂| 伦理中文字幕亚洲| 精品欠久久久中文字幕加勒比| 丰满爆乳一区二区三区| 国产嫩草影院久久久久| 国产精品色综合| 高清视频欧美一级| 精品一区毛片| 超碰中文字幕在线观看| 洋洋av久久久久久久一区| 成人激情四射网| 日韩免费观看高清| 91精品亚洲| 中文字幕影片免费在线观看| 色网站国产精品| 国产网友自拍视频导航网站在线观看| 91福利视频导航| 久久美女性网| 日韩欧美123区| 日韩av网站导航| 亚洲精品伊人| 无码人妻丰满熟妇区96| 国产精品久久久久久久岛一牛影视 | 国产免费一区二区三区四区五区| 最好看的2019年中文视频| 视频一区中文字幕精品| 日韩中文字幕组| 一区二区成人在线观看| 久久精品色图| 波多野结衣久草一区| 丝袜亚洲另类欧美| 久草视频手机在线观看| 在线不卡国产精品| 国产一区二区三区不卡av| 一个色综合久久| 狠狠躁18三区二区一区| 1区2区在线观看| 午夜精品亚洲一区二区三区嫩草 | 伊人久久久久久久久久久久久久| 亚洲国产精品久久91精品| 国产美女久久|