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

我靠(call) ,我的未來(Future)在哪里???

開發 后端
本文將分為兩個部分,第一部分分別介紹 任務、執行、以及結果這三個概念在 Java API 中的實體和各自的繼承關系,第二部分通過一個簡單的例子回顧他們的用法,再理解下這兩個問題的答案。

[[335797]]

本篇文章是讀者投稿,來和你一起聊一聊 Future ~

我們大家都知道,在 Java 中創建線程主要有三種方式:

  • 繼承 Thread 類;
  • 實現 Runnable 接口;
  • 實現 Callable 接口。

而后兩者的區別在于 Callable 接口中的 call() 方法可以異步地返回一個計算結果 Future,并且一般需要配合 ExecutorService 來執行。這一套操作在代碼實現上似乎也并不難,可是對于call()方法具體怎么(被ExecutorService)執行的,以及 Future 這個結果是怎么獲取的,卻又不是很清楚了。

那么本篇文章,我們就一起來學習下 Callable 接口以及 Future 的使用,主要面向兩個問題:

  • 承載著具體任務的 call() 方法如何被執行的?
  • 任務的執行結果如何得到?

你可能會說,這兩個難道不是一個問題嗎?任務執行了就會有返回結果,而返回結果也一定是任務執行了才返回的,難道還能返回一個其他任務的結果么??不要著急,耐心的看下去,你就會發現,這兩個還真的就是一個問題。

本文將分為兩個部分,第一部分分別介紹 任務、執行、以及結果這三個概念在 Java API 中的實體和各自的繼承關系,第二部分通過一個簡單的例子回顧他們的用法,再理解下這兩個問題的答案。

Callable、Executor 與 Future

既然是一個任務被執行并返回結果,那么我們先來看看具體的任務,也就是 Callable 接口。

任務:Callable

非常簡單,只包含一個有泛型「返回值」的 call() 方法,需要在最后返回定義類型的結果。如果任務沒有需要返回的結果,那么將泛型 V 設為 void 并return null;就可以了。對比的是 Runnable,另一個明顯的區別則是 Callable可以拋出異常。

  1. public interface Callable<V> { 
  2.     V call() throws Exception; 
  3.  
  4.  
  5. public interface Runnable { 
  6.     public abstract void run(); 

執行:ExecutorService

說到線程就少不了線程池,而說到線程池肯定離不開 Executor 接口。下面這幅圖是 Executor 的框架,我們常用的是其中的兩個具體實現類 ThreadPoolExecutor 以及 ScheduledThreadPoolExecutor,在 Executors 類中通過靜態方法獲取。Executors 中包含了線程池以及線程工廠的構造,與 Executor 接口的關系類似于 Collection 接口和 Collections 類的關系。

 

那么我們自頂向下,從源碼上了解一下 Executor 框架,學習學習任務是如何被執行的。首先是 Executor 接口,其中只定義了 execute() 方法。

  1. public interface Executor { 
  2.     void execute(Runnable command); 

ExecutorService 接口繼承了 Executor 接口,主要擴展了一系列的 submit() 方法以及對 executor 的終止和判斷狀態。以第一個 Future submit(Callable task);為例,其中 task 為用戶定義的執行的異步任務,Future 表示了任務的執行結果,泛型 T 代表任務結果的類型。

  1. public interface ExecutorService extends Executor { 
  2.  
  3.     void shutdown();                // 現有任務完成后停止線程池 
  4.   
  5.     List<Runnable> shutdownNow();   // 立即停止線程池 
  6.  
  7.     boolean isShutdown();           // 判斷是否已停止 
  8.  
  9.     boolean isTerminated(); 
  10.  
  11.     <T> Future<T> submit(Callable<T> task);        // 提交Callale任務 
  12.  
  13.     <T> Future<T> submit(Runnable task, T result); 
  14.  
  15.     Future<?> submit(Runnable task); 
  16.  
  17.     // 針對Callable集合的invokeAll()等方法 

抽象類AbstractExecutorService 是 ThreadPoolExecutor 的基類,在下面的代碼中,它實現了ExecutorService 接口中的 submit() 方法。注釋中是對應的 newTaskFor() 方法的代碼,非常簡單,就是將傳入的Callable 或 Runnable 參數封裝成一個 FutureTask 對象。

  1. // 1.第一個重載方法,參數為Callable 
  2. public <T> Future<T> submit(Callable<T> task) { 
  3.   if (task == null) throw new NullPointerException(); 
  4.   RunnableFuture<T> ftask = newTaskFor(task); 
  5.   // return new FutureTask<T>(callable); 
  6.   execute(ftask); 
  7.   return ftask; 
  8.  
  9. // 2.第二個重載方法,參數為Runnable 
  10. public Future<?> submit(Runnable task) { 
  11.   if (task == null) throw new NullPointerException(); 
  12.   RunnableFuture<Void> ftask = newTaskFor(task, null); 
  13.   // return new FutureTask<T>(task, null); 
  14.   execute(ftask); 
  15.   return ftask; 
  16.  
  17. // 3.第三個重載方法,參數為Runnable + 返回對象 
  18. public <T> Future<T> submit(Runnable task, T result) { 
  19.   if (task == null) throw new NullPointerException(); 
  20.   RunnableFuture<T> ftask = newTaskFor(task, result); 
  21.   // return new FutureTask<T>(task, result); 
  22.   execute(ftask); 
  23.   return ftask; 

那么也就是說,無論傳入的是 Callable 還是 Runnable,submit() 方法其實就做了三件事

 

具體來說,submit() 中首先生成了一個 RunnableFuture 引用的 FutureTask 實例,然后調用 execute() 方法來執行它,那么我們可以推測 FutureTask 繼承自 RunnableFuture,而 RunnableFuture 又實現了 Runnable,因為execute() 的參數應為 Runnable 類型。上面還涉及到了 FutureTask 的構造函數,也來看一下。

  1. public FutureTask(Callable<V> callable) { 
  2.   this.callable = callable; 
  3.   this.state = NEW; 
  4.  
  5. public FutureTask(Runnable runnable, V result) { 
  6.   this.callable = Executors.callable(runnable, result); // 通過適配器將runnable在call()中執行并返回result 
  7.   this.state = NEW; 

FutureTask 共有兩個構造方法。第一個構造方法比較簡單,對應上面的第一個 submit(),采用組合的方式封裝Callable 并將狀態設為NEW;而第二個構造方法對應上面的后兩個 submit() 重載,不同之處是首先使用了Executors.callable來將 Runnable 和 result 組合成 Callable,這里采用了適配器RunnableAdapter implements Callable,巧妙地在 call() 中執行 Runnable 并返回結果。

  1. static final class RunnableAdapter<T> implements Callable<T> { 
  2.   final Runnable task; 
  3.   final T result;                // 返回的結果;顯然:需要在run()中賦值 
  4.  
  5.   RunnableAdapter(Runnable task, T result) { 
  6.     this.task = task; 
  7.     this.result = result; 
  8.   } 
  9.   public T call() { 
  10.     task.run(); 
  11.     return result; 
  12.   } 

在適配器設計模式中,通常包含目標接口 Target、適配器 Adapter 和被適配者 Adaptee 三類角色,其中目標接口代表客戶端(當前業務系統)所需要的功能,通常為借口或抽象類;被適配者為現存的不能滿足使用需求的類;適配器是一個轉換器,也稱 wrapper,用于給被適配者添加目標功能,使得客戶端可以按照目標接口的格式正確訪問。對于 RunnableAdapter 來說,Callable 是其目標接口,而 Runnable 則是被適配者。RunnableAdapter 通過覆蓋 call() 方法使其可按照 Callable 的要求來使用,同時其構造方法中接收被適配者和目標對象,滿足了 call() 方法有返回值的要求。

 

那么總結一下 submit() 方法執行的流程,就是:「Callable 被封裝在 Runnable 的子類中傳入 execute() 得以執行」。

結果:Future

要說 Future 就是異步任務的執行結果其實并不準確,因為它代表了一個任務的執行過程,有狀態、可以被取消,而 get() 方法的返回值才是任務的結果。

  1. public interface Future<V> { 
  2.  
  3.     boolean cancel(boolean mayInterruptIfRunning); 
  4.  
  5.     boolean isCancelled(); 
  6.  
  7.     boolean isDone(); 
  8.  
  9.     V get() throws InterruptedException, ExecutionException; 
  10.  
  11.     V get(long timeout, TimeUnit unit) 
  12.         throws InterruptedException, ExecutionException, TimeoutException; 

我們在上面中還提到了 RuunableFuture 和 FutureTask。從官方的注釋來看,RuunableFuture 就是一個可以 run的 future,實現了 Runnable 和 Future 兩個接口,在 run() 方法中執行完計算時應該將結果保存起來以便通過 get()獲取。

  1. public interface RunnableFuture<V> extends Runnable, Future<V> { 
  2.     /** 
  3.      * Sets this Future to the result of its computation unless it has been cancelled. 
  4.      */ 
  5.     void run(); 

FutureTask 直接實現了 RunnableFuture 接口,作為執行過程,共有下面這幾種狀態,其中 COMPLETING 為一個暫時狀態,表示正在設置結果或異常,對應的,設置完成后狀態變為 NORMAL 或 EXCEPTIONAL;CANCELLED、INTERRUPTED 表示任務被取消或中斷。在上面的構造方法中,將 state 初始化為 NEW。

  1. private volatile int state; 
  2.  private static final int NEW          = 0; 
  3.  private static final int COMPLETING   = 1; 
  4.  private static final int NORMAL       = 2; 
  5.  private static final int EXCEPTIONAL  = 3; 
  6.  private static final int CANCELLED    = 4; 
  7.  private static final int INTERRUPTING = 5; 
  8.  private static final int INTERRUPTED  = 6; 

然后是 FutureTask 的主要內容,主要是 run() 和 get()。注意 outcome 的注釋,無論是否發生異常返回的都是這個 outcome,因為在執行中如果執行成功就將結果設置給了它(set()),而發生異常時將異常賦給了他(setException()),而在獲取結果時也都返回了 outcome(通過report())。

  1. public class FutureTask<V> implements RunnableFuture<V> { 
  2.      
  3.     private Callable<V> callable;         // target,待執行的任務 
  4.      
  5.     /** 保存執行結果或異常,在get()方法中返回/拋出 */ 
  6.     private Object outcome; // 非volatile,通過CAS保證線程安全 
  7.      
  8.      
  9.     public void run() { 
  10.         ...... 
  11.         Callable<V> c = callable; 
  12.         if (c != null && state == NEW) { 
  13.             V result; 
  14.             boolean ran; 
  15.             try { 
  16.                 result = c.call();            // 調用call()執行用戶任務并獲取結果 
  17.                 ran = true;                   // 執行完成,ran置為true 
  18.             } catch (Throwable ex) {          // 調用call()出現異常,而run()方法繼續執行 
  19.                  result = null
  20.                  ran = false
  21.                  setException(ex);             
  22.                  // setException(Throwable t): compareAndSwapInt(NEW, COMPLETING);  outcome = t;       
  23.             } 
  24.             if (ran) 
  25.                 set(result);                   
  26.              // set(V v): compareAndSwapInt(NEW, COMPLETING);  outcome = v; 
  27.         } 
  28.     } 
  29.      
  30.      
  31.     public V get() throws InterruptedException, ExecutionException { 
  32.         int s = state; 
  33.         if (s <= COMPLETING) 
  34.             s = awaitDone(false, 0L);         // 加入隊列等待COMPLETING完成,可響應超時、中斷 
  35.         return report(s); 
  36.     } 
  37.  
  38.     public V get(long timeout, TimeUnit unit) 
  39.         throws InterruptedException, ExecutionException, TimeoutException { 
  40.         // 超時等待 
  41.     } 
  42.      
  43.     private V report(int s) throws ExecutionException { 
  44.         Object x = outcome; 
  45.         if (s == NORMAL)                              // 將outcome作為執行結果返回 
  46.             return (V)x; 
  47.         if (s >= CANCELLED) 
  48.             throw new CancellationException(); 
  49.         throw new ExecutionException((Throwable)x);   // 將outcome作為捕獲的返回 
  50.     } 

FutureTask 實現了 RunnableFuture 接口,所以有兩方面的作用。

第一,作為 Runnable 傳入 execute() 方法來執行,同時封裝 Callable 對象并在 run() 中調用其 call() 方法;

第二,作為 Future 管理任務的執行狀態,將 call() 的返回值保存在 outcome 中以通過 get() 獲取。這似乎就能回答開頭的兩個問題,并且渾然天成,就好像是一個問題,除非發生異常的時候返回的不是任務的結果而是異常對象。

總結一下繼承關系:

 

二、使用舉例

文章的標題有點唬人,說到底還是講 Callable 的用法。現在我們知道了 Future 代表了任務執行的過程和結果,作為 call() 方法的返回值來獲取執行結果;而 FutureTask 是一個 Runnable 的 Future,既是任務執行的過程和結果,又是 call 方法最終執行的載體。下面通過一個例子看看他們在使用上的區別。

首先創建一個任務,即定義一個任務類實現 Callable 接口,在 call() 方法里添加我們的操作,這里用耗時三秒然后返回 100 模擬計算過程。

  1. class MyTask implements Callable<Integer> { 
  2.     @Override 
  3.     public Integer call() throws Exception { 
  4.         System.out.println("子線程開始計算..."); 
  5.         for (int i=0;i<3;++i){ 
  6.             Thread.sleep(1000); 
  7.             System.out.println("子線程計算中,用時 "+(i+1)+" 秒"); 
  8.         } 
  9.         System.out.println("子線程計算完成,返回:100"); 
  10.         return 100; 
  11.     } 

然后呢,創建一個線程池,并實例化一個 MyTask 備用。

  1. ExecutorService executor = Executors.newCachedThreadPool(); 
  2. MyTask task = new MyTask(); 

現在,分別使用 Future 和 FutureTask 來獲取執行結果,看看他們有什么區別。

使用Future

Future 一般作為 submit() 的返回值使用,并在主線程中以阻塞的方式獲取異步任務的執行結果。

  1. System.out.println("主線程啟動線程池"); 
  2. Future<Integer> future = executor.submit(task); 
  3. System.out.println("主線程得到返回結果:"+future.get()); 
  4. executor.shutdown(); 

看看輸出結果:

  1. 主線程啟動線程池 
  2. 子線程開始計算... 
  3. 子線程計算中,用時 1 秒 
  4. 子線程計算中,用時 2 秒 
  5. 子線程計算中,用時 3 秒 
  6. 子線程計算完成,返回:100 
  7. 主線程得到返回結果:100 

主線程啟動線程池子線程開始計算...子線程計算中,用時 1 秒子線程計算中,用時 2 秒子線程計算中,用時 3 秒子線程計算完成,返回:100主線程得到返回結果:100

由于 get() 方法阻塞獲取結果,所以輸出順序為子線程計算完成后主線程輸出結果。

使用FutureTask

由于 FutureTask 集「任務與結果」于一身,所以我們可以使用 FutureTask 自身而非返回值來管理任務,這需要首先利用 Callable 對象來構造 FutureTask,并調用不同的submit()重載方法。

  1. System.out.println("主線程啟動線程池"); 
  2. FutureTask<Integer> futureTask = new FutureTask<>(task); 
  3. executor.submit(futureTask);                                 // 作為Ruunable傳入submit()中 
  4. System.out.println("主線程得到返回結果:"+futureTask.get());    // 作為Future獲取結果 
  5. executor.shutdown(); 

這段程序的輸出與上面中完全相同,其實兩者在實際執行中的區別也不大,雖然前者調用了submit(Callable task)而后者調用了submit(Runnable task),但最終都通過execute(futuretask)來把任務加入線程池中。

總結

上面大費周章其實只是盡可能細致地講清楚了 Callable 中的任務是如何執行的,總結起來就是:

線程池中,submit() 方法實際上將 Callable 封裝在 FutureTask 中,將其作為 Runnable 的子類傳給 execute()真正執行;

FutureTask 在 run() 中調用 Callable 對象的 call() 方法并接收返回值或捕獲異常保存在Object outcome中,同時管理執行過程中的狀態state;

FutureTask 同時作為 Future 的子類,通過 get() 返回任務的執行結果,若未執行完成則通過等待隊列進行阻塞等待完成;

FutureTask 作為一個 Runnable 的 Future,其中最重要的兩個方法如下。

本文轉載自微信公眾號「Java建設者」,可以通過以下二維碼關注。轉載本文請聯系Java建設者公眾號。

 

責任編輯:武曉燕 來源: Java建設者
相關推薦

2021-10-20 09:20:40

手機定位互聯網位置服務

2022-07-01 21:13:46

NFT加密SuperRare

2010-11-17 09:07:39

2012-01-01 19:25:02

2013-12-18 18:29:13

操作系統

2013-07-16 10:00:39

Windows操作系統

2021-02-25 23:52:52

區塊鏈游戲數字貨幣

2013-09-16 10:18:06

大數據

2017-06-22 10:39:06

Android開發者未來

2014-03-19 10:59:02

Android WeaGoogle

2011-06-10 09:10:53

2018-07-17 15:41:37

服務器虛擬化未來

2011-07-22 09:40:39

2015-08-19 09:02:35

2009-12-17 16:47:57

APC

2013-07-29 16:08:02

2017-11-07 20:02:47

程序員未來

2015-11-04 09:58:15

H5開發未來

2015-06-11 11:19:35

點贊
收藏

51CTO技術棧公眾號

av网站在线免费播放| 国产一级性生活| 激情综合婷婷| 亚洲国产精品一区二区www| 久久久人人爽| 国产视频在线观看视频| 亚洲区第一页| 色哟哟入口国产精品| 日本天堂在线播放| 成人一级视频| 午夜精品久久久久影视| 亚洲精蜜桃久在线| 性欧美18一19性猛交| 久久只有精品| 久久久久久久久亚洲| 亚洲色图日韩精品| 林ゆな中文字幕一区二区| 欧美性色黄大片手机版| 日本十八禁视频无遮挡| 日韩伦理在线电影| 久久久美女艺术照精彩视频福利播放| 91中文字幕在线| www.久久久久久久| 亚洲成人直播| 欧美xxxx14xxxxx性爽| 国产中年熟女高潮大集合| 亚洲图色一区二区三区| 欧美日韩成人在线| 日日摸天天爽天天爽视频| wwwwxxxx在线观看| 国产精品国产三级国产专播品爱网| 国产美女99p| www精品国产| 国产一区激情在线| 国产在线精品自拍| 在线观看亚洲黄色| 久久人人超碰| 69国产精品成人在线播放| 免费在线看黄网址| 欧美伊人影院| 久久这里只有精品99| 毛片视频免费播放| 日本一区二区三区视频| 国产视频精品自拍| 国产精品久久久久久久无码| 免费精品一区二区三区在线观看| 欧美人体做爰大胆视频| 日本人69视频| 欧美网站免费| 欧美妇女性影城| 色一情一区二区| 久久亚洲资源中文字| 欧美午夜精品久久久| 激情综合网俺也去| 欧美舌奴丨vk视频| 在线精品亚洲一区二区不卡| 欧美视频免费播放| 日韩精选视频| 91福利国产成人精品照片| 女性隐私黄www网站视频| 中文在线免费二区三区| 欧美性猛交xxxx免费看漫画 | 朝桐光av一区二区三区| 久久精品凹凸全集| 日韩不卡在线观看| 极品粉嫩小仙女高潮喷水久久 | 一区二区三区视频免费看| 亚洲成人中文| 日本久久久久久久久| 日本黄色中文字幕| 久久成人18免费观看| 91日本视频在线| wwwav网站| 91免费视频大全| 日韩jizzz| 黄色网页在线看| 亚洲福中文字幕伊人影院| 国产h视频在线播放| 亚洲精品在线影院| 在线成人高清不卡| 国产精品欧美性爱| 亚洲va久久| 色青青草原桃花久久综合| 国产免费无码一区二区视频 | 97视频在线观看亚洲| 亚洲GV成人无码久久精品| 欧美aⅴ一区二区三区视频| 成人在线播放av| 丰满岳乱妇国产精品一区| 久久亚洲一区二区三区明星换脸| 亚洲图片都市激情| 国产桃色电影在线播放| 日韩欧美福利视频| 亚洲自拍第三页| 偷拍自拍亚洲色图| 久久久久999| 成人精品在线看| 久久精品99国产精品| 国产91色在线|亚洲| 精品成人一区二区三区免费视频| 亚洲六月丁香色婷婷综合久久| 黄色一级在线视频| 亚洲国产91视频| 精品亚洲一区二区三区在线观看 | 成人国产精品av| 视频一区二区免费| 综合色中文字幕| 日韩av黄色网址| 日韩视频1区| 在线看日韩欧美| 成年人午夜视频| 国产主播一区二区| 日韩欧美激情一区二区| 17videosex性欧美| 欧美一区二区视频在线观看2022| 亚洲av无码一区二区二三区| 欧美女激情福利| 国产日韩在线看| 黄色片在线免费观看| 亚洲国产精品嫩草影院| 午夜免费一级片| 成人激情电影在线| 欧美在线免费观看| 人妻精品一区二区三区| 亚洲另类在线一区| 亚洲欧美自偷自拍另类| 香蕉久久精品日日躁夜夜躁| 色综合久久中文字幕综合网小说| 中文在线观看av| 久久久99精品免费观看不卡| www.日本在线播放| 亚洲日本va| 欧美超级乱淫片喷水| 中文天堂在线视频| 欧美国产日韩在线观看| 茄子视频成人免费观看| 四虎5151久久欧美毛片| 久久久免费精品视频| 亚洲精品喷潮一区二区三区| 亚洲欧美日韩国产一区二区三区| 香港日本韩国三级网站| 欧美日韩性在线观看| 国产精品99久久久久久久久久久久 | 日本乱理伦在线| 日韩一卡二卡三卡四卡| 五月综合色婷婷| 久久99国产精品久久| 亚洲一区三区视频在线观看| 成人久久网站| 最近2019年手机中文字幕| 最近中文字幕在线免费观看| 久久久国产一区二区三区四区小说| 黄色www网站| 日韩av不卡一区| 日本精品视频在线观看| 超碰97在线免费观看| 欧美四级电影在线观看| 欧美一区二区三区观看| 国产主播一区二区| www.激情网| 国产福利资源一区| 欧美一级bbbbb性bbbb喷潮片| 亚洲av电影一区| 日韩欧美有码在线| 中文字幕第二区| 极品少妇一区二区三区精品视频| 99精品一区二区三区的区别| 亚洲一区网址| 欧美在线视频网站| 免费在线看黄色| 精品国产一区久久| 欧美在线观看不卡| 欧美国产激情二区三区| 亚洲国产午夜精品| 伊人影院久久| 欧美亚洲丝袜| 色999久久久精品人人澡69| 欧美成人午夜激情视频| 天堂在线观看av| 欧洲国产伦久久久久久久| 91视频青青草| av在线播放不卡| 一区二区三区 日韩| 欧美精品aa| 久久亚洲免费| 色婷婷成人网| 91成品人片a无限观看| 成年人在线观看| 日韩免费观看高清完整版 | 欧日韩不卡视频| 国产超碰在线一区| 欧美精品一区二区三区免费播放| 99精品全国免费观看视频软件| 99在线热播| 69堂免费精品视频在线播放| 久久99热这里只有精品国产| 国产三级视频在线| 精品久久久久久亚洲综合网| 九九热最新视频| 午夜精品aaa| 国产乱子轮xxx农村| 91丝袜国产在线播放| 免费看污污网站| 日韩午夜一区| 国产又大又长又粗又黄| 女厕嘘嘘一区二区在线播放| 91久久精品国产91久久性色tv| 中文在线最新版地址| 久久99精品久久久久久青青91| 黄色在线免费观看大全| 精品女同一区二区| 艳妇乳肉豪妇荡乳av| 欧美日韩在线视频观看| 免费人成在线观看| 国产精品成人一区二区艾草| 97人妻精品一区二区三区免| 粉嫩久久99精品久久久久久夜| 韩国日本美国免费毛片| 国产日韩一区二区三区在线| 成人国产在线看| 欧美aaaa视频| 五码日韩精品一区二区三区视频| 日韩av字幕| 国产精品日韩欧美一区二区| 国产精品久久久久久久久久久久久久久 | 国产精品欧美综合| 疯狂做受xxxx欧美肥白少妇| 久久中文字幕在线观看| 依依成人精品视频| 国产极品美女在线| 中文字幕在线播放不卡一区| 国产欧美一区二区三区在线观看视频| 91亚洲大成网污www| 日本美女视频网站| 粉嫩高潮美女一区二区三区| 黑人巨大猛交丰满少妇| 国产精品综合久久| 久久成年人网站| 久久99精品久久久久久国产越南 | 九九精品视频在线观看| caopon在线免费视频| 久久精品国产免费观看| 麻豆影院在线观看| 久久大大胆人体| 91高清在线观看视频| 久久天天躁狠狠躁夜夜av| av大片在线| 欧美日韩成人在线播放| 成人福利电影| 97久久国产精品| 久久人体大尺度| 国产精品久久久精品| 免费成人毛片| 96pao国产成视频永久免费| 精品国产三区在线| 福利精品视频| 欧美深夜视频| 神马欧美一区二区| 婷婷亚洲综合| 男人添女人荫蒂免费视频| 亚洲高清电影| 国产精品无码一区二区在线| 久久国产精品久久久久久电车| 欧美黑人又粗又大又爽免费| 免费美女久久99| 四虎成人在线播放| caoporm超碰国产精品| 无码国产69精品久久久久同性| 国产亚洲精久久久久久| 亚洲女人久久久| 亚洲午夜久久久久久久久电影院 | 青草在线视频在线观看| 97国产在线视频| 激情亚洲影院在线观看| 91久久久国产精品| 国产精品45p| 日韩aⅴ视频一区二区三区| 久久久久午夜电影| 精品国产一区三区| 日本成人超碰在线观看| 国产伦理在线观看| 久久蜜臀中文字幕| 久久久久久久久久97| 午夜精品一区二区三区免费视频 | 密臀av在线播放| 国产欧美日韩高清| 盗摄牛牛av影视一区二区| 欧洲高清一区二区| 午夜精品久久久久99热蜜桃导演 | 欧美黑人疯狂性受xxxxx野外| 国产精品自在线| 大伊香蕉精品在线品播放| 水蜜桃亚洲一二三四在线| 国内综合精品午夜久久资源| 国产一区中文字幕| 91淫黄看大片| 国产成人99久久亚洲综合精品| 9.1成人看片免费版| 亚洲精品一二三| 青青视频在线免费观看| 日韩你懂的在线播放| 福利视频在线看| 国内精品美女av在线播放| 欧美大陆国产| 欧美亚洲精品日韩| 亚洲日韩成人| 在线免费黄色小视频| 欧美韩日一区二区三区| 国产精品500部| 精品国产一区二区三区av性色| 3p视频在线观看| 日韩美女视频免费看| 国产精品午夜av| 日本老太婆做爰视频| 久久精品国产一区二区三区免费看| 黄色性生活一级片| 亚洲一区在线视频| www.国产.com| 久久精品人人做人人爽| 成人做爰免费视频免费看| 欧美精品一区二区三区在线四季| 极品日韩av| 亚洲一区和二区| 一区二区三区精品| 国产av一区二区三区| 日韩视频永久免费观看| 国产香蕉久久| 天堂资源在线亚洲视频| 天堂蜜桃一区二区三区 | 国产乱人乱偷精品视频a人人澡 | 舐め犯し波多野结衣在线观看| 午夜一区二区三区视频| 亚洲精品97久久中文字幕无码| www.久久色.com| 91精品视频一区二区| 亚洲一区二区三区午夜| 麻豆久久久久久久| 91无套直看片红桃在线观看| 欧美日韩一区不卡| 3p在线观看| 成人福利在线视频| 女同性一区二区三区人了人一| 国产成人强伦免费视频网站| 亚洲欧美日韩久久| 国产女人18毛片水真多| 久久av在线播放| 日本精品在线观看| 秋霞在线一区二区| 国产自产高清不卡| 午夜免费激情视频| 精品福利在线导航| 欧美在线极品| 欧美日韩国产综合视频在线| 久久精品主播| 国产黄色大片免费看| 欧美日韩亚洲丝袜制服| 黄色免费在线看| av蓝导航精品导航| 99精品国产在热久久| 日韩精品无码一区二区三区久久久| 在线观看三级视频欧美| 午夜免费福利在线观看| 成人性生交大片免费看视频直播 | 精品国产乱码久久久久久1区二区| 亚洲欧洲av一区二区三区久久| 97国产成人无码精品久久久| 久久香蕉国产线看观看av| 在线日韩成人| 精品视频无码一区二区三区| 国产精品狼人久久影院观看方式| 91福利在线观看视频| 欧美黑人性猛交| 自拍亚洲一区| 红桃视频 国产| 亚洲成人资源网| 成人av毛片| av一区观看| 日韩综合小视频| 欧美成人精品欧美一级私黄| 亚洲精品v欧美精品v日韩精品| 中文.日本.精品| 久青草视频在线播放| 国产午夜精品一区二区三区视频 | 波多野结衣一区二区三区四区| 色av中文字幕一区| 老司机精品在线| 在线看免费毛片| 精品久久中文字幕久久av| 日本三级在线播放完整版| 国产精品推荐精品| 麻豆一区二区在线| 男人的天堂一区二区| 日韩少妇与小伙激情| 天天久久夜夜| 精品人妻一区二区三区免费| 色婷婷久久综合| 国精一区二区三区| 一本一本a久久| 2021国产精品久久精品| 国产特黄一级片|