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

什么,你還不會用CompletableFuture?

開發 后端
本篇會介紹CompletableFuture的api,并用一些示例演示如何去使用。

[[387949]]

上一篇我們講了Future機制,有興趣的可以參考談談Future、Callable、FutureTask關系

但Future機制,還不那么靈活,比如怎么去利用Future機制描述兩個任務串行執行,又或是兩個任務并行執行,又或是只關心最先執行結束的任務結果。

Future機制在一定程度上都無法快速地滿足以上需求,CompletableFuture便應運而生了。

本片會介紹CompletableFuture的api,并用一些示例演示如何去使用。

1. 創建一個異步任務

  1. public static <U> CompletableFuture<U> supplyAsync(Supplier<U> supplier) 
  2.  
  3.  public static <U> CompletableFuture<U> supplyAsync(Supplier<U> supplier,Executor executor); 
  4.  
  5.  public static CompletableFuture<Void> runAsync(Runnable runnable); 
  6.  
  7.  public static CompletableFuture<Void> runAsync(Runnable runnable,Executor executor); 

supplyAsync與runAsync的區別在于:supplyAsync有返回值,而runAsync沒有返回值

帶Executor參數的構造函數,則使用線程池中的線程執行異步任務(線程池可以參考說說線程池)

不帶Executor參數的構造函數,則使用ForkJoinPool.commonPool()中的線程執行異步任務(Fork/Join框架可以參考談談并行流parallelStream)

1.1 示例:使用supplyAsync創建一個有返回值的異步任務

  1. public class Case1 { 
  2.  
  3.     public static void main(String[] args) throws Exception { 
  4.  
  5.         CompletableFuture<Integer> completableFuture=CompletableFuture.supplyAsync(()->{ 
  6.             try { 
  7.                 Thread.sleep(1000); 
  8.             } catch (InterruptedException e) { 
  9.                 e.printStackTrace(); 
  10.             } 
  11.             return 1; 
  12.         }); 
  13.         //該方法會一直阻塞 
  14.         Integer result = completableFuture.get(); 
  15.         System.out.println(result); 
  16.     } 
  17.  

2. 異步任務的回調

  1. public CompletableFuture<T> whenComplete(BiConsumer<? super T, ? super Throwable> action); 
  2.  
  3.   public CompletableFuture<T> whenCompleteAsync(BiConsumer<? super T, ? super Throwable> action); 
  4.  
  5.   public CompletableFuture<T> whenCompleteAsync(BiConsumer<? super T, ? super Throwable> action, Executor executor); 
  6.  
  7.   public CompletableFuture<T> exceptionally(Function<Throwable, ? extends T> fn); 

whenComplete開頭的方法在計算任務完成(包括正常完成與出現異常)之后會回調

而exceptionally則只會在計算任務出現異常時才會被回調

如何確定哪個線程去回調whenComplete,比較復雜,先略過。

而回調whenCompleteAsync的線程比較簡單,隨便拿一個空閑的線程即可,后綴是Async的方法同理。

2.1 示例:計算出現異常,使用whenComplete與exceptionally進行處理

  1. package com.qcy.testCompleteableFuture; 
  2.  
  3. import java.util.concurrent.CompletableFuture; 
  4. import java.util.concurrent.ExecutionException; 
  5. import java.util.function.BiConsumer; 
  6. import java.util.function.Function
  7. import java.util.stream.IntStream; 
  8.  
  9. /** 
  10.  * @author qcy 
  11.  * @create 2020/09/07 17:40:44 
  12.  */ 
  13. public class Case2 { 
  14.  
  15.     public static void main(String[] args) throws Exception { 
  16.  
  17.         CompletableFuture<Integer> completableFuture = CompletableFuture.supplyAsync(() -> { 
  18.             try { 
  19.                 Thread.sleep(1000); 
  20.             } catch (InterruptedException e) { 
  21.                 e.printStackTrace(); 
  22.             } 
  23.             System.out.println("執行supplyAsync的線程:" + Thread.currentThread().getName()); 
  24.             int i = 1 / 0; 
  25.             return 1; 
  26.         }); 
  27.  
  28.         completableFuture.whenComplete(new BiConsumer<Integer, Throwable>() { 
  29.             @Override 
  30.             public void accept(Integer integer, Throwable throwable) { 
  31.                 System.out.println("執行whenComplete的線程:" + Thread.currentThread().getName()); 
  32.                 if (throwable == null) { 
  33.                     System.out.println("計算未出現異常,結果:" + integer); 
  34.                 } 
  35.             } 
  36.         }); 
  37.  
  38.         completableFuture.exceptionally(new Function<Throwable, Integer>() { 
  39.             @Override 
  40.             public Integer apply(Throwable throwable) { 
  41.                 //出現異常時,則返回一個默認值 
  42.                 System.out.println("計算出現異常,信息:" + throwable.getMessage()); 
  43.                 return -1; 
  44.             } 
  45.         }); 
  46.  
  47.         System.out.println(completableFuture.get()); 
  48.     } 
  49.  

輸出:

當然,CompletableFuture內的各種方法是支持鏈式調用與Lambda表達式的,我們進行如下改寫:

  1. public static void main(String[] args) throws Exception { 
  2.  
  3.      CompletableFuture<Integer> completableFuture = CompletableFuture.supplyAsync(() -> { 
  4.          try { 
  5.              Thread.sleep(2000); 
  6.          } catch (InterruptedException e) { 
  7.              e.printStackTrace(); 
  8.          } 
  9.          System.out.println("執行supplyAsync的線程:" + Thread.currentThread().getName()); 
  10.          int i = 1 / 0; 
  11.          return 1; 
  12.      }).whenComplete((integer, throwable) -> { 
  13.          System.out.println("執行whenComplete的線程:" + Thread.currentThread().getName()); 
  14.          if (throwable == null) { 
  15.              System.out.println("計算未出現異常,結果:" + integer); 
  16.          } 
  17.      }).exceptionally(throwable -> { 
  18.          //出現異常時,則返回一個默認值 
  19.          System.out.println("計算出現異常,信息:" + throwable.getMessage()); 
  20.          return -1; 
  21.      }); 
  22.  
  23.      System.out.println("計算結果:" + completableFuture.get()); 
  24.  } 

3. 任務串行化執行

  1. public <U> CompletableFuture<U> thenApply(Function<? super T,? extends U> fn); 
  2.  
  3.   public CompletableFuture<Void> thenRun(Runnable action); 
  4.  
  5.   public CompletableFuture<Void> thenAccept(Consumer<? super T> action); 
  6.  
  7.   public <U> CompletableFuture<U> handle(BiFunction<? super T, Throwable, ? extends U> fn); 
  8.  
  9.   public <U> CompletableFuture<U> thenCompose(Function<? super T, ? extends CompletionStage<U>> fn); 

thenApply,依賴上一次任務執行的結果,參數中的Function<? super T,? extends U>,T代表上一次任務返回值的類型,U代表當前任務返回值的類型,當上一個任務沒有出現異常時,thenApply才會被調用

thenRun,不需要知道上一個任務的返回結果,只是在上一個任務執行完成之后開始執行Runnable

thenAccept,依賴上一次任務的執行結果,因為入參是Consumer,所以不返回任何值。

handle和thenApply相似,不過當上一個任務出現異常時,能夠執行handle,卻不會去執行thenApply

thenCompose,傳入一次任務執行的結果,返回一個新的CompleteableFuture對象

3.1 示例:使用串行化任務分解兩數相乘并輸出

  1. package com.qcy.testCompleteableFuture; 
  2.  
  3. import java.util.concurrent.CompletableFuture; 
  4.  
  5. /** 
  6.  * @author qcy 
  7.  * @create 2020/09/07 17:40:44 
  8.  */ 
  9. public class Case4 { 
  10.  
  11.     public static void main(String[] args) { 
  12.          
  13.         CompletableFuture.supplyAsync(() -> 2) 
  14.                 .thenApply(num -> num * 3) 
  15.                 .thenAccept(System.out::print); 
  16.     } 
  17.  

很顯然,輸出為6

3.2 示例:使用串行化任務并且模擬出現異常

  1. package com.qcy.testCompleteableFuture; 
  2.  
  3. import java.util.concurrent.CompletableFuture; 
  4. import java.util.function.BiFunction; 
  5.  
  6. /** 
  7.  * @author qcy 
  8.  * @create 2020/09/07 17:40:44 
  9.  */ 
  10. public class Case4 { 
  11.  
  12.     public static void main(String[] args) { 
  13.  
  14.         CompletableFuture.supplyAsync(() -> 2) 
  15.                 .thenApply(num -> num / 0) 
  16.                 .thenApply(result -> result * 3) 
  17.                 .handle((integer, throwable) -> { 
  18.                     if (throwable == null) { 
  19.                         return integer
  20.                     } else { 
  21.                         throwable.printStackTrace(); 
  22.                         return -1; 
  23.                     } 
  24.                 }).thenAccept(System.out::print); 
  25.     } 
  26.  

最終會輸出-1

4. 任務同時執行,且都需要執行完成

  1. public <U,V> CompletableFuture<V> thenCombine(CompletionStage<? extends U> other, 
  2. Function<? super T,? super U,? extends V> fn); 
  3.  
  4.   public <U> CompletableFuture<Void> thenAcceptBoth(CompletionStage<? extends U> other, 
  5. Consumer<? super T, ? super U> action); 
  6.  
  7.   public CompletableFuture<Void> runAfterBoth(CompletionStage<?> other,Runnable action); 
  8.  
  9.   public static CompletableFuture<Void> allOf(CompletableFuture<?>... cfs); 

thenCombine,合并兩個任務,兩個任務可以同時執行,都執行成功后,執行最后的BiFunction操作。其中T代表第一個任務的執行結果類型,U代表第二個任務的執行結果類型,V代表合并的結果類型

thenAcceptBoth,和thenCombine特性用法都極其相似,唯一的區別在于thenAcceptBoth進行一個消費,沒有返回值

runAfterBoth,兩個任務都執行完成后,但不關心他們的返回結構,然后去執行一個Runnable。

allOf,當所有的任務都執行完成后,返回一個CompletableFuture

4.1 示例:使用thenCombine合并任務

  1. package com.qcy.testCompleteableFuture; 
  2.  
  3. import java.util.concurrent.CompletableFuture; 
  4. import java.util.concurrent.ExecutionException; 
  5.  
  6. /** 
  7.  * @author qcy 
  8.  * @create 2020/09/07 17:40:44 
  9.  */ 
  10. public class Case5 { 
  11.  
  12.     public static void main(String[] args) throws Exception { 
  13.  
  14.         CompletableFuture<Integer> cf1 = CompletableFuture.supplyAsync(() -> { 
  15.             System.out.println("任務1開始"); 
  16.             try { 
  17.                 Thread.sleep(3000); 
  18.             } catch (InterruptedException e) { 
  19.                 e.printStackTrace(); 
  20.             } 
  21.             System.out.println("任務1結束"); 
  22.             return 2; 
  23.         }); 
  24.  
  25.         CompletableFuture<Integer> cf2 = CompletableFuture.supplyAsync(() -> { 
  26.             System.out.println("任務2開始"); 
  27.             try { 
  28.                 Thread.sleep(3000); 
  29.             } catch (InterruptedException e) { 
  30.                 e.printStackTrace(); 
  31.             } 
  32.             System.out.println("任務2結束"); 
  33.             return 3; 
  34.         }); 
  35.  
  36.         CompletableFuture<Integer> completableFuture = cf1.thenCombine(cf2, (result1, result2) -> result1 * result2); 
  37.         System.out.println("計算結果:" + completableFuture.get()); 
  38.     } 
  39.  

輸出:

可以看到兩個任務確實是同時執行的

當然,熟練了之后,直接使用鏈式操作,代碼如下:

  1. package com.qcy.testCompleteableFuture; 
  2.  
  3. import java.util.concurrent.CompletableFuture; 
  4.  
  5. /** 
  6.  * @author qcy 
  7.  * @create 2020/09/07 17:40:44 
  8.  */ 
  9. public class Case6 { 
  10.  
  11.     public static void main(String[] args) throws Exception { 
  12.  
  13.         CompletableFuture<Integer> completableFuture = CompletableFuture.supplyAsync(() -> { 
  14.             System.out.println("任務1開始"); 
  15.             try { 
  16.                 Thread.sleep(3000); 
  17.             } catch (InterruptedException e) { 
  18.                 e.printStackTrace(); 
  19.             } 
  20.             System.out.println("任務1結束"); 
  21.             return 2; 
  22.         }).thenCombine(CompletableFuture.supplyAsync(() -> { 
  23.             System.out.println("任務2開始"); 
  24.             try { 
  25.                 Thread.sleep(2000); 
  26.             } catch (InterruptedException e) { 
  27.                 e.printStackTrace(); 
  28.             } 
  29.             System.out.println("任務2結束"); 
  30.             return 3; 
  31.         }), (result1, result2) -> result1 * result2); 
  32.  
  33.         System.out.println("計算結果:" + completableFuture.get()); 
  34.     } 
  35.  

5. 任務同時執行,且只取最先完成的那個任務

  1. public <U> CompletableFuture<U> applyToEither(CompletionStage<? extends T> other, Function<? super T, U> fn); 
  2.  
  3.    public CompletableFuture<Void> acceptEither(CompletionStage<? extends T> other, Consumer<? super T> action); 
  4.  
  5.    public CompletableFuture<Void> runAfterEither(CompletionStage<?> other,Runnable action); 
  6.  
  7.    public static CompletableFuture<Object> anyOf(CompletableFuture<?>... cfs); 

applyToEither,最新執行完任務,將其結果執行Function操作,其中T是最先執行完的任務結果類型,U是最后輸出的類型

acceptEither,最新執行完的任務,將其結果執行消費操作

runAfterEither,任意一個任務執行完成之后,執行Runnable操作

anyOf,多個任務中,返回最先執行完成的CompletableFuture

5.1 示例:兩個任務同時執行,打印最先完成的任務的結果

  1. package com.qcy.testCompleteableFuture; 
  2.  
  3. import java.util.concurrent.CompletableFuture; 
  4.  
  5. /** 
  6.  * @author qcy 
  7.  * @create 2020/09/07 17:40:44 
  8.  */ 
  9. public class Case7 { 
  10.  
  11.     public static void main(String[] args) throws Exception { 
  12.  
  13.         CompletableFuture<Void> completableFuture = CompletableFuture.supplyAsync(() -> { 
  14.             System.out.println("任務1開始"); 
  15.             try { 
  16.                 Thread.sleep(3000); 
  17.             } catch (InterruptedException e) { 
  18.                 e.printStackTrace(); 
  19.             } 
  20.             System.out.println("任務1結束"); 
  21.             return 2; 
  22.         }).acceptEither(CompletableFuture.supplyAsync(() -> { 
  23.             System.out.println("任務2開始"); 
  24.             try { 
  25.                 Thread.sleep(2000); 
  26.             } catch (InterruptedException e) { 
  27.                 e.printStackTrace(); 
  28.             } 
  29.             System.out.println("任務2結束"); 
  30.             return 3; 
  31.         }), result -> System.out.println(result)); 
  32.  
  33.         //等待CompletableFuture返回,防止主線程退出 
  34.         completableFuture.join(); 
  35.     } 
  36.  

輸出:

可以看得到,任務2結束后,直接不再執行任務1的剩余代碼

5.2 示例:多個任務同時執行,打印最先完成的任務的結果

  1. package com.qcy.testCompleteableFuture; 
  2.  
  3. import java.util.concurrent.CompletableFuture; 
  4.  
  5. /** 
  6.  * @author qcy 
  7.  * @create 2020/09/07 17:40:44 
  8.  */ 
  9. public class Case8 { 
  10.  
  11.     public static void main(String[] args) throws Exception { 
  12.  
  13.         CompletableFuture<Integer> cf1 = CompletableFuture.supplyAsync(() -> { 
  14.             System.out.println("任務1開始"); 
  15.             try { 
  16.                 Thread.sleep(3000); 
  17.             } catch (InterruptedException e) { 
  18.                 e.printStackTrace(); 
  19.             } 
  20.             System.out.println("任務1結束"); 
  21.             return 2; 
  22.         }); 
  23.  
  24.         CompletableFuture<Integer> cf2 = CompletableFuture.supplyAsync(() -> { 
  25.             System.out.println("任務2開始"); 
  26.             try { 
  27.                 Thread.sleep(2000); 
  28.             } catch (InterruptedException e) { 
  29.                 e.printStackTrace(); 
  30.             } 
  31.             System.out.println("任務2結束"); 
  32.             return 3; 
  33.         }); 
  34.  
  35.         CompletableFuture<Integer> cf3 = CompletableFuture.supplyAsync(() -> { 
  36.             System.out.println("任務3開始"); 
  37.             try { 
  38.                 Thread.sleep(4000); 
  39.             } catch (InterruptedException e) { 
  40.                 e.printStackTrace(); 
  41.             } 
  42.             System.out.println("任務3結束"); 
  43.             return 4; 
  44.         }); 
  45.  
  46.         CompletableFuture<Object> firstCf = CompletableFuture.anyOf(cf1, cf2, cf3); 
  47.         System.out.println(firstCf.get()); 
  48.     } 
  49.  

輸出:

 

責任編輯:姜華 來源: 今日頭條
相關推薦

2020-05-14 08:59:28

API網關性能

2022-02-22 08:25:51

typeScript泛型概念泛型使用

2024-09-09 08:36:36

Java操作遠程服務器

2024-08-12 12:25:25

SpringMVC開發

2020-09-01 14:17:03

WindowsDefender微軟

2020-10-21 10:02:16

架構運維技術

2022-08-01 08:17:46

mysqlwindows系統

2020-09-27 06:50:56

Java互聯網注解

2019-09-03 09:30:46

ss 命令SocketLinux

2020-09-15 09:50:47

程序員技能開發者

2020-12-18 09:45:33

DockerLinux命令

2020-08-26 14:40:38

explainMySQL數據庫

2025-07-04 02:00:00

2020-11-09 09:03:35

高并發多線程ThreadLocal

2012-05-02 15:38:49

金山快盤網盤

2025-08-18 02:15:00

2022-09-09 14:56:18

Linuxcpu

2020-12-07 09:15:00

JavaScript數組 reduce

2018-09-13 10:40:40

Linux命令find

2019-11-28 16:48:00

華為Mate X
點贊
收藏

51CTO技術棧公眾號

免费在线视频一区| 国产亚洲欧美日韩在线观看一区二区 | 国产又大又黄又粗又爽| 黄色网在线免费看| 成人性生交大片免费看视频在线| 91sa在线看| 影音先锋男人看片资源| 一区二区三区视频播放| 色狠狠一区二区三区香蕉| 亚洲自拍的二区三区| 99草在线视频| 免费日韩一区二区| 日韩亚洲欧美成人| 国产亚洲无码精品| 99精品女人在线观看免费视频| 亚洲福利视频一区二区| 亚洲欧美日韩精品在线| 人妻精品一区一区三区蜜桃91| 日本午夜精品视频在线观看| 欧美黑人又粗大| 少妇一级黄色片| 99ri日韩精品视频| 欧美日韩精品欧美日韩精品一| 青草青青在线视频| 国产小视频在线| 成人福利视频在线看| 国产伦精品免费视频| 国产香蕉视频在线| 欧美成熟视频| 日韩亚洲国产中文字幕| 成人在线一级片| 国产成人澳门| 日韩午夜精品电影| 欧美女同在线观看| 视频二区不卡| 岛国av一区二区| 被灌满精子的波多野结衣| 天堂中文8资源在线8| 久久久久久毛片| 国产一区二区精品在线| 超碰在线人人干| 韩日精品视频一区| 国产欧美一区二区三区视频| 日韩人妻精品中文字幕| 在线亚洲成人| 91精品国产乱码久久久久久久久 | 五月天婷婷综合| 青青视频免费在线| 在线xxxx| 亚洲综合在线五月| 国产传媒久久久| 91精品久久| 一区二区三区不卡视频| 先锋影音男人资源| 伊人222成人综合网| 日韩理论片一区二区| 自拍偷拍亚洲色图欧美| 欧美日本高清| 亚洲欧洲精品成人久久奇米网| 亚洲国产精品毛片| 欧美三级黄网| 亚洲精品欧美在线| 欧洲精品在线播放| 91高清视频在线观看| 午夜精品免费在线观看| 97国产精东麻豆人妻电影| 色在线视频观看| 色悠悠亚洲一区二区| 国产精品亚洲a| japanese23hdxxxx日韩| 欧美性猛交xxxx乱大交退制版 | 国产亚洲一区二区手机在线观看 | 欧美女人性生活视频| 一区一区三区| 在线国产电影不卡| 日本人69视频| 99精品中文字幕在线不卡| 亚洲精品一区二区三区四区高清| 午夜一区二区三区免费| 国产探花一区在线观看| 久久久久99精品久久久久| 久久久久99精品成人片试看| 亚洲黄网站黄| 国产精品高潮在线| 99视频免费看| 久久夜色精品国产噜噜av| 特级西西444www大精品视频| a免费在线观看| 精品国产电影一区| 中文字幕国产传媒| 三级欧美日韩| 亚洲欧美日韩精品| 男人在线观看视频| 亚洲福利一区| 国产精品视频自拍| 亚洲欧美高清视频| 久久久91精品国产一区二区精品 | 婷婷成人激情| 亚洲1区2区3区4区| 色www免费视频| 国产精品99久久免费观看| 亚洲欧美日韩天堂| 麻豆亚洲av熟女国产一区二| 首页欧美精品中文字幕| 亚洲曰本av电影| 天堂在线一二区| 亚洲免费观看高清完整版在线 | 欧美激情国产日韩| 成人影院在线观看| 色成年激情久久综合| 97中文字幕在线观看| 精品欧美久久| 午夜精品久久久久久久久久久久久| 成人黄色激情视频| 成人午夜又粗又硬又大| 亚洲一区二区精品在线| 午夜伦理福利在线| 日韩一区二区三区视频在线观看| 青青草福利视频| 99久久精品久久久久久ai换脸| 樱花www成人免费视频| 欧美另类tv| 欧美色男人天堂| 亚洲av无码一区二区三区网址| 91精品国产91久久综合| 国产精品 欧美在线| 婷婷丁香花五月天| 亚洲自拍与偷拍| 一级片黄色免费| 国产精品久久久久久久久妇女| 日韩av电影院| 日本电影一区二区在线观看| 亚洲午夜精品久久久久久久久| 加勒比av中文字幕| 欧美日韩中文字幕一区二区三区| 国产69久久精品成人| 狠狠人妻久久久久久综合麻豆| 亚洲天堂av一区| 999精品视频在线| 欧美美女在线| 国产精品爱啪在线线免费观看 | 日韩国产精品视频| 国产亚洲自拍av| 成人午夜免费视频| 欧美大黑帍在线播放| 欧美日韩黄网站| 欧美日韩第一页| 99国产揄拍国产精品| 亚洲品质自拍视频| 在线观看免费看片| 中文字幕一区二区三区欧美日韩 | 大香伊人久久精品一区二区| 欧美美最猛性xxxxxx| 成人av手机在线| 亚洲自拍欧美精品| 挪威xxxx性hd极品| 亚洲精品社区| 欧美激情专区| 日本在线中文字幕一区二区三区| 一区二区成人av| 一二三区中文字幕| 亚洲色图20p| 免费不卡av网站| 激情久久中文字幕| 久久香蕉综合色| av在线日韩| www亚洲欧美| 成人激情四射网| 午夜精品福利久久久| 性色av蜜臀av色欲av| 天堂资源在线中文精品| 亚洲国产精品一区二区第一页| 婷婷久久免费视频| 欧美激情国产精品| 日批视频在线播放| 欧美综合天天夜夜久久| 久久精品在线观看视频| 国产黑丝在线一区二区三区| 欧美精品久久久久久久久久久| 亚洲第一二三区| 国产精品日韩在线播放| 天堂成人av| 亚洲欧美激情视频| 国产三级漂亮女教师| 午夜电影网一区| 日本精品久久久久中文| 国产精品一二三四区| 男人日女人逼逼| 91影院成人| 国产一区二区免费在线观看| 成人一区视频| 欧美激情一二三| 成年人在线视频免费观看| 欧美一级欧美三级在线观看| 欧美一级片免费在线观看| 国产蜜臀av在线一区二区三区| 国产女同无遮挡互慰高潮91| 亚洲黄色影院| 大地资源第二页在线观看高清版| 国产精品主播在线观看| 国产有码在线一区二区视频| 91九色porn在线资源| 日韩天堂在线视频| 涩涩视频免费看| 在线播放欧美女士性生活| 色播视频在线播放| 国产精品久久久久国产精品日日| 亚洲天堂2024| 国产原创一区二区三区| 国产成人手机视频| 在线欧美不卡| 中文字幕の友人北条麻妃| 国模精品一区| 国产中文一区二区| 欧洲大片精品免费永久看nba| 日韩美女在线观看| 2020国产在线| 久久国产精品影视| 丝袜美腿美女被狂躁在线观看| 亚洲国产精品国自产拍av秋霞| 91欧美日韩麻豆精品| 欧洲国内综合视频| 老熟妇仑乱一区二区av| 亚洲福利视频一区二区| 欧美国产在线看| 亚洲欧洲日韩综合一区二区| 亚洲国产av一区| 久久综合色鬼综合色| 国产精品成人99一区无码| 国产精品一区在线观看你懂的| 免费涩涩18网站入口| 久久一区二区三区四区五区 | 在线播放91灌醉迷j高跟美女 | 玖玖国产精品视频| 久色视频在线播放| 伊人久久大香线蕉综合热线 | 国产视色精品亚洲一区二区| 日韩三级精品| 亚洲一区二区在线播放| 91精品福利观看| 国产欧美日韩中文字幕在线| 国产a亚洲精品| 国产精品青青在线观看爽香蕉| 电影亚洲精品噜噜在线观看| 日韩av电影院| 色8久久影院午夜场| 国产成人精品久久久| 欧美精品日日操| 国产精品久久国产精品99gif| 偷拍精品精品一区二区三区| 国产成人精品视频在线| 日本美女久久| 成人看片人aa| 国产美女视频一区二区| 97久久人人超碰caoprom欧美| 欧美日本三级| 国产乱码精品一区二区三区卡| 麻豆精品99| 欧美日韩视频在线一区二区观看视频| 久草成人资源| 亚洲一区不卡在线| 欧美黄污视频| 欧美 日韩 国产 高清| 日韩国产在线观看一区| 亚洲国产成人va在线观看麻豆| 韩国女主播成人在线| 亚洲成人激情小说| av网站在线看| 疯狂欧美牲乱大交777| 六月丁香在线视频| 在线精品视频小说1| 91超薄丝袜肉丝一区二区| 欧美一级片在线| 午夜成人免费影院| 伊人伊成久久人综合网小说| 麻豆传媒视频在线观看| 久久久久久久国产| 男人最爱成人网| 成人黄色在线观看| ady日本映画久久精品一区二区| 久久精品日产第一区二区三区| 久久99久久人婷婷精品综合| 亚洲精品视频一二三| 欧美黄色一区二区| 无码人妻丰满熟妇区毛片18| 久久电影网站中文字幕| 在线播放第一页| 国产日韩欧美制服另类| 婷婷久久综合网| 欧美日韩一区二区免费在线观看 | 色欲av无码一区二区三区| 国产情人综合久久777777| 免费成人深夜夜行网站| 亚洲成人一区在线| 老熟妇一区二区三区啪啪| 日韩免费成人网| 色网站在线免费观看| 日韩中文字幕国产精品| 中文字幕成在线观看| 91热精品视频| 欧美女优在线视频| 国产传媒久久久| 久久爱另类一区二区小说| 国产又黄又粗又猛又爽的视频| 中文字幕日本乱码精品影院| 99久热在线精品996热是什么| 777精品伊人久久久久大香线蕉| 天堂成人在线观看| 久久综合伊人77777尤物| www.日韩| 国产伦理久久久| 91精品国产乱码久久久久久| 男女av免费观看| 高清视频一区二区| 在线观看黄网址| 91久久精品一区二区| 天天躁日日躁狠狠躁伊人| 美女少妇精品视频| 国产91欧美| 日韩欧美视频第二区| 国产欧美日韩综合一区在线播放 | 在线免费观看一级片| 亚洲精品一区二区久| 丁香花在线观看完整版电影| 91丨九色丨国产在线| 沈樵精品国产成av片| 黄色av网址在线播放| 成人免费三级在线| 欧美激情图片小说| 午夜一区二区三区不卡视频| 成人网页在线免费观看| 欧美美乳视频| 欧美 国产 日本| 91在线视频免费91| 国产在线观看成人| 欧美xxxxxxxx| 婷婷色在线播放| 成人资源视频网站免费| 欧美成人69av| wwwww在线观看| 一区二区三区四区蜜桃| 国产av精国产传媒| 欧美成人四级hd版| 日韩一区二区三区精品| 亚洲小说欧美另类激情| 国产在线播放一区三区四| www.毛片com| 欧美成人高清电影在线| 免费看电影在线| 国产久一道中文一区| 尤物在线精品| 亚洲一区二区三区黄色| 亚洲成a人v欧美综合天堂下载| 欧美一级淫片aaaaaa| 91av视频在线播放| 亚洲va久久久噜噜噜久久| 欧美视频第一区| 国产婷婷色一区二区三区在线| 香蕉污视频在线观看| 夜夜嗨av色综合久久久综合网| www.成人在线视频| 中文字幕一区二区三区乱码| 国产乱码一区二区三区| 九九热精品在线观看| 亚洲精品国精品久久99热| 9i看片成人免费高清| 视频一区不卡| 国模大尺度一区二区三区| 久久国产精品二区| 亚洲国产精品久久久久久| 在线观看涩涩| 亚洲国产精品久久久久婷婷老年| 国产一区二区福利| 国产精品99精品| 国产亚洲精品日韩| 国产精品xnxxcom| 可以看毛片的网址| 久久久久久久一区| 国产三级自拍视频| 97国产在线视频| 成人毛片在线| 欧美日韩一区二区区| 欧美日韩在线视频观看| 色视频在线免费观看| 高清国语自产拍免费一区二区三区| 亚洲一区二区免费看| 色婷婷粉嫩av| 亚洲成人网av| 韩国理伦片久久电影网| 国产乱子伦精品无码专区| 国产婷婷色一区二区三区| www.av黄色| 国产精品69av| 女同性一区二区三区人了人一| 国产精品一区二区入口九绯色| 欧美日本视频在线| 国产在线精彩视频| 伊人婷婷久久| 久久久99精品免费观看不卡| 丰满少妇一级片|