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

Java并發(fā):juc Executor框架詳解

開發(fā) 后端
Executor 框架是 juc 里提供的線程池的實現(xiàn)。前兩天看了下 Executor 框架的一些源碼,做個簡單的總結。

Executor 框架是 juc 里提供的線程池的實現(xiàn)。前兩天看了下 Executor 框架的一些源碼,做個簡單的總結。

線程池大概的思路是維護一個的線程池用于執(zhí)行提交的任務。我理解池的技術的主要意義有兩個:

1. 資源的控制,如并發(fā)量限制。像連接池這種是對數(shù)據(jù)庫資源的保護。

2. 資源的有效利用,如線程復用,避免頻繁創(chuàng)建線程和線程上下文切換。

那么想象中設計一個線程池就需要有線程池大小、線程生命周期管理、等待隊列等等功能,下面結合代碼看看原理。

Excutor 整體結構如下:

 

Executor 接口定義了最基本的 execute 方法,用于接收用戶提交任務。 ExecutorService 定義了線程池終止和創(chuàng)建及提交 futureTask 任務支持的方法。

AbstractExecutorService 是抽象類,主要實現(xiàn)了 ExecutorService 和 futureTask 相關的一些任務創(chuàng)建和提交的方法。

ThreadPoolExecutor 是最核心的一個類,是線程池的內(nèi)部實現(xiàn)。線程池的功能都在這里實現(xiàn)了,平時用的最多的基本就是這個了。其源碼很精練,遠沒當時想象的多。

ScheduledThreadPoolExecutor 在 ThreadPoolExecutor 的基礎上提供了支持定時調(diào)度的功能。線程任務可以在一定延時時間后才被觸發(fā)執(zhí)行。

1、ThreadPoolExecutor 原理

1.1 ThreadPoolExecutor內(nèi)部的幾個重要屬性

1.線程池本身的狀態(tài)

  1. volatile int runState;   
  2. static final int RUNNING = 0;   
  3. static final int SHUTDOWN = 1;   
  4. static final int STOP = 2;   
  5. static final int TERMINATED = 3;  

2.等待任務隊列和工作集

  1. private final BlockingQueue<Runnable> workQueue; //等待被執(zhí)行的Runnable任務   
  2. private final HashSet<Worker> workers = new HashSet<Worker>(); //正在被執(zhí)行的Worker任務集  

 3.線程池的主要狀態(tài)鎖。線程池內(nèi)部的狀態(tài)變化 ( 如線程大小 ) 都需要基于此鎖。

  1. private final ReentrantLock mainLock = new ReentrantLock(); 

4.線程的存活時間和大小

  1. private volatile long keepAliveTime;// 線程存活時間   
  2. private volatile boolean allowCoreThreadTimeOut;// 是否允許核心線程存活   
  3. private volatile int corePoolSize;// 核心池大小   
  4. private volatile int maximumPoolSize; // 最大池大小   
  5. private volatile int poolSize; //當前池大小   
  6. private int largestPoolSize; //最大池大小,區(qū)別于maximumPoolSize,是用于記錄線程池曾經(jīng)達到過的最大并發(fā),理論上小于等于maximumPoolSize。   

5.線程工廠和拒絕策略

  1. private volatile RejectedExecutionHandler handler;// 拒絕策略,用于當線程池無法承載新線程是的處理策略。  
  2.  private volatile ThreadFactory threadFactory;// 線程工廠,用于在線程池需要新創(chuàng)建線程的時候創(chuàng)建線程 

6.線程池完成任務數(shù)

  1. private long completedTaskCount;//線程池運行到當前完成的任務數(shù)總和  

1.2 ThreadPoolExecutor 的內(nèi)部工作原理

有了以上定義好的數(shù)據(jù),下面來看看內(nèi)部是如何實現(xiàn)的 。 Doug Lea 的整個思路總結起來就是 5 句話:

  1. 如果當前池大小 poolSize 小于 corePoolSize ,則創(chuàng)建新線程執(zhí)行任務。
  2. 如果當前池大小 poolSize 大于 corePoolSize ,且等待隊列未滿,則進入等待隊列
  3. 如果當前池大小 poolSize 大于 corePoolSize 且小于 maximumPoolSize ,且等待隊列已滿,則創(chuàng)建新線程執(zhí)行任務。
  4. 如果當前池大小 poolSize 大于 corePoolSize 且大于 maximumPoolSize ,且等待隊列已滿,則調(diào)用拒絕策略來處理該任務。
  5. 線程池里的每個線程執(zhí)行完任務后不會立刻退出,而是會去檢查下等待隊列里是否還有線程任務需要執(zhí)行,如果在 keepAliveTime 里等不到新的任務了,那么線程就會退出。

下面看看代碼實現(xiàn):

線程池最重要的方法是由 Executor 接口定義的 execute 方法 , 是任務提交的入口。

我們看看 ThreadPoolExecutor.execute(Runnable cmd) 的實現(xiàn):

  1. public void execute(Runnable command) {  
  2.         if (command == null)  
  3.             throw new NullPointerException();  
  4.         if (poolSize >= corePoolSize || !addIfUnderCorePoolSize(command)) {  
  5.             if (runState == RUNNING && workQueue.offer(command)) {  
  6.                 if (runState != RUNNING || poolSize == 0)  
  7.                     ensureQueuedTaskHandled(command);  
  8.             }  
  9.             else if (!addIfUnderMaximumPoolSize(command))  
  10.                 reject(command); // is shutdown or saturated  
  11.         }  
  12. }  

解釋如下:

當提交一個新的 Runnable 任務:

分支1 : 如果當前池大小小于 corePoolSize, 執(zhí)行 addIfUnderCorePoolSize(command) , 如果線程池處于運行狀態(tài)且 poolSize < corePoolSize addIfUnderCorePoolSize(command) 會做如下事情,將 Runnable 任務封裝成 Worker 任務 , 創(chuàng)建新的 Thread ,執(zhí)行 Worker 任務。如果不滿足條件,則返回 false 。

代碼如下:

  1.  private boolean addIfUnderCorePoolSize(Runnable firstTask) {  
  2.         Thread t = null;  
  3.         final ReentrantLock mainLock = this.mainLock;  
  4.         mainLock.lock();  
  5.         try {  
  6.             if (poolSize < corePoolSize && runState == RUNNING)  
  7.                 t = addThread(firstTask);  
  8.         } finally {  
  9.             mainLock.unlock();  
  10.         }  
  11.         if (t == null)  
  12.             return false;  
  13.         t.start();  
  14.         return true;  
  15. }  

分支2 : 如果大于 corePoolSize 或 1 失敗失敗,則:

  • 如果等待隊列未滿,把 Runnable 任務加入到 workQueue 等待隊列
    workQueue .offer(command)
  • 如多等待隊列已經(jīng)滿了,調(diào)用 addIfUnderMaximumPoolSize(command) ,和 addIfUnderCorePoolSize 基本類似,只不過判斷條件是 poolSize < maximumPoolSize 。如果大于 maximumPoolSize ,則把 Runnable 任務交由 RejectedExecutionHandler 來處理。

問題:如何實現(xiàn)線程的復用?

Doug Lea 的實現(xiàn)思路是 線程池里的每個線程執(zhí)行完任務后不立刻退出,而是去檢查下等待隊列里是否還有線程任務需要執(zhí)行,如果在 keepAliveTime 里等不到新的任務了,那么線程就會退出。這個功能的實現(xiàn) 關鍵在于 Worker 。線程池在執(zhí)行 Runnable 任務的時候,并不單純把 Runnable 任務交給創(chuàng)建一個 Thread 。而是會把 Runnable 任務封裝成 Worker 任務。

下面看看 Worker 的實現(xiàn):

代碼很簡單,可以看出, worker 里面包裝了 firstTask 屬性,在構造worker 的時候傳進來的那個 Runnable 任務就是 firstTask 。 同時也實現(xiàn)了Runnable接口,所以是個代理模式,看看代理增加了哪些功能。 關鍵看 woker 的 run 方法:

  1. public void run() {  
  2.            try {  
  3.                Runnable task = firstTask;  
  4.                firstTask = null;  
  5.                while (task != null || (task = getTask()) != null) {  
  6.                    runTask(task);  
  7.                    task = null;  
  8.                }  
  9.            } finally {  
  10.                workerDone(this);  
  11.            }  
  12.        }  

可以看出 worker 的 run 方法是一個循環(huán),第一次循環(huán)運行的必然是 firstTask ,在運行完 firstTask 之后,并不會立刻結束,而是會調(diào)用 getTask 獲取新的任務( getTask 會從等待隊列里獲取等待中的任務),如果 keepAliveTime 時間內(nèi)得到新任務則繼續(xù)執(zhí)行,得不到新任務則那么線程才會退出。這樣就保證了多個任務可以復用一個線程,而不是每次都創(chuàng)建新任務。 keepAliveTime 的邏輯在哪里實現(xiàn)的呢?主要是利用了 BlockingQueue 的 poll 方法支持等待。可看 getTask 的代碼段:

  1. if (state == SHUTDOWN)  // Help drain queue  
  2.     r = workQueue.poll();  
  3. else if (poolSize > corePoolSize || allowCoreThreadTimeOut)  
  4.     r = workQueue.poll(keepAliveTime, TimeUnit.NANOSECONDS);  
  5. else 
  6.     r = workQueue.take();  

2.ThreadFactory 和R ejectedExecutionHandler

ThreadFactory 和 RejectedExecutionHandler是ThreadPoolExecutor的兩個屬性,也 可以認為是兩個簡單的擴展點 . ThreadFactory 是創(chuàng)建線程的工廠。

默認的線程工廠會創(chuàng)建一個帶有“ pool-poolNumber-thread-threadNumber ”為名字的線程,如果我們有特別的需要,如線程組命名、優(yōu)先級等,可以定制自己的 ThreadFactory 。

RejectedExecutionHandler 是拒絕的策略。常見有以下幾種:

AbortPolicy :不執(zhí)行,會拋出 RejectedExecutionException 異常。

CallerRunsPolicy :由調(diào)用者(調(diào)用線程池的主線程)執(zhí)行。

DiscardOldestPolicy :拋棄等待隊列中最老的。

DiscardPolicy: 不做任何處理,即拋棄當前任務。

3.ScheduledThreadPoolExecutor

ScheduleThreadPoolExecutor 是對ThreadPoolExecutor的集成。增加了定時觸發(fā)線程任務的功能。需要注意

從內(nèi)部實現(xiàn)看, ScheduleThreadPoolExecutor 使用的是 corePoolSize 線程和一個無界隊列的固定大小的池,所以調(diào)整 maximumPoolSize 沒有效果。無界隊列是一個內(nèi)部自定義的 DelayedWorkQueue 。

ScheduleThreadPoolExecutor 線程池接收定時任務的方法是 schedule ,看看內(nèi)部實現(xiàn):

  1. public ScheduledFuture<?> schedule(Runnable command,  
  2.                                    long delay,  
  3.                                    TimeUnit unit) {  
  4.     if (command == null || unit == null)  
  5.         throw new NullPointerException();  
  6.     RunnableScheduledFuture<?> t = decorateTask(command,  
  7.         new ScheduledFutureTask<Void>(command, null,  
  8.                                       triggerTime(delay, unit)));  
  9.  
  10.     delayedExecute(t);  
  11.     return t;  
  12. }  

以上代碼會初始化一個 RunnableScheduledFuture 類型的任務 t, 并交給 delayedExecute 方法。 delayedExecute(t) 方法實現(xiàn)如下:

  1.     private void delayedExecute(Runnable command) {  
  2.         if (isShutdown()) {  
  3.             reject(command);  
  4.             return;  
  5.         }  
  6.         if (getPoolSize() < getCorePoolSize())  
  7.             prestartCoreThread();  
  8.  
  9.         super.getQueue().add(command);  
  10. }  

如果當前線程池大小 poolSize 小于 CorePoolSize ,則創(chuàng)建一個新的線程,注意這里創(chuàng)建的線程是空的,不會把任務直接交給線程來做,而是把線程任務放到隊列里。因為任務是要定時觸發(fā)的,所以不能直接交給線程去執(zhí)行。

問題: 那如何做到定時觸發(fā)呢?

關鍵在于DelayedWorkQueue,它代理了 DelayQueue ??梢哉J為 DelayQueue 是這樣一個隊列(具體可以去看下源碼,不詳細分析):

1. 隊列里的元素按照任務的 delay 時間長短升序排序, delay 時間短的在隊頭, delay 時間長的在隊尾。

2. 從 DelayQueue 里 FIFO 的獲取一個元素的時候,不會直接返回 head ??赡軙枞鹊?head 節(jié)點到達 delay 時間后才能被獲取。可以看下 DelayQueue 的 take 方法實現(xiàn):

  1. public E take() throws InterruptedException {  
  2.     final ReentrantLock lock = this.lock;  
  3.     lock.lockInterruptibly();  
  4.     try {  
  5.         for (;;) {  
  6.             E first = q.peek();  
  7.             if (first == null) {  
  8.                 available.await();  
  9.             } else {  
  10.                 long delay =  first.getDelay(TimeUnit.NANOSECONDS);  
  11.                 if (delay > 0) {  
  12.                     long tl = available.awaitNanos(delay);//等待delay時間  
  13.                 } else {  
  14.                     E x = q.poll();  
  15.                     assert x != null;  
  16.                     if (q.size() != 0)  
  17.                         available.signalAll(); // wake up other takers  
  18.                     return x;  
  19.                 }  
  20.             }  
  21.         }  
  22.     } finally {  
  23.         lock.unlock();  
  24.     }  

4.線程池使用策略

通過以上的詳解基本上能夠定制出自己需要的策略了,下面簡單介紹下Executors里面提供的一些常見線程池策略:

1.FixedThreadPool

  1. public static ExecutorService newFixedThreadPool(int nThreads) {  
  2.     return new ThreadPoolExecutor(nThreads, nThreads,  
  3.                                   0L, TimeUnit.MILLISECONDS,  
  4.                                   new LinkedBlockingQueue<Runnable>());  

實際上就是個不支持keepalivetime,且corePoolSize和maximumPoolSize相等的線程池。

2.SingleThreadExecutor

  1. public static ExecutorService newSingleThreadExecutor() {  
  2.     return new FinalizableDelegatedExecutorService  
  3.         (new ThreadPoolExecutor(11,  
  4.                                 0L, TimeUnit.MILLISECONDS,  
  5.                                 new LinkedBlockingQueue<Runnable>()));  

實際上就是個不支持keepalivetime,且corePoolSize和maximumPoolSize都等1的線程池。

3.CachedThreadPool

  1. public static ExecutorService newCachedThreadPool() {  
  2.     return new ThreadPoolExecutor(0, Integer.MAX_VALUE,  
  3.                                   60L, TimeUnit.SECONDS,  
  4.                                   new SynchronousQueue<Runnable>());  

實際上就是個支持keepalivetime時間是60秒(線程空閑存活時間),且corePoolSize為0,maximumPoolSize無窮大的線程池。

4.SingleThreadScheduledExecutor

  1. public static ScheduledExecutorService newSingleThreadScheduledExecutor(ThreadFactory threadFactory) {  
  2.     return new DelegatedScheduledExecutorService  
  3.         (new ScheduledThreadPoolExecutor(1, threadFactory));  
  4. }  

實際上是個corePoolSize為1的ScheduledExecutor。上文說過ScheduledExecutor采用無界等待隊列,所以maximumPoolSize沒有作用。

5.ScheduledThreadPool

  1. public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) {  
  2.     return new ScheduledThreadPoolExecutor(corePoolSize);  

實際上是corePoolSize課設定的ScheduledExecutor。上文說過ScheduledExecutor采用無界等待隊列,所以maximumPoolSize沒有作用。

以上還不一定滿足你的需要,完全可以根據(jù)自己需要去定制。

原文鏈接:http://singleant.iteye.com/blog/1423931

【編輯推薦】

  1. 設計Java應用程序的平滑停止
  2. 深入Java探索:Java內(nèi)存區(qū)域
  3. 深入Java虛擬機:Class文件實例解析
  4. 同一段程序在Java和C中的不同結果
  5. Java初學者都必須理解的六大問題
責任編輯:林師授 來源: singleant的博客
相關推薦

2015-11-06 10:26:53

JavaExecutor框架

2015-12-24 10:13:29

JavaExecutor框架

2017-02-14 10:00:19

Java開發(fā)Lock

2025-05-20 08:31:19

2019-11-19 09:00:38

JavaAND信號量

2025-06-13 10:00:00

JavaJUC 包

2019-07-18 11:08:09

Java并發(fā)框架

2023-12-14 07:36:16

Java并發(fā)原子類

2024-11-13 15:09:57

Java線程開發(fā)

2017-08-07 20:50:27

JavaForkJoin

2017-08-04 11:41:53

Javathreadpool框架

2023-03-24 15:44:52

Java多線程工具

2016-08-18 13:56:33

AndroidExecutorsubmit

2025-01-03 08:40:53

Java并發(fā)編程Guava庫

2025-06-13 08:00:00

Java并發(fā)編程volatile

2025-07-01 08:20:00

JUC包Java并發(fā)

2012-02-13 09:57:51

JavaDisruptor

2021-02-03 06:15:26

工具postManHttp

2010-04-27 09:17:23

內(nèi)存屏障JVM

2023-10-05 11:12:06

JUCUnsafe安全
點贊
收藏

51CTO技術棧公眾號

日本久久综合网| 亚洲人视频在线| 日韩一级中文字幕| 亚洲自拍另类| 中文字幕精品久久| 欧美高清精品一区二区| 亚洲天堂手机| 国产精品青草久久| 草莓视频一区| 无码人妻黑人中文字幕| 亚洲mv大片欧洲mv大片| 欧美精品一区二区久久婷婷| 国产一区视频免费观看| 国内精品不卡| 久久久国产综合精品女国产盗摄| 国产综合久久久久| 在线能看的av| 欧美精品二区| 在线性视频日韩欧美| 国内自拍偷拍视频| 国产精品4hu.www| 五月婷婷欧美视频| 国产卡一卡二在线| 黄色网址在线播放| 不卡的看片网站| 成人激情视频在线观看| 黄瓜视频在线免费观看| 伊人色**天天综合婷婷| 国产亚洲精品美女久久久久| 国产精品久久久久久亚洲av| 色综合视频一区二区三区44| 欧美天堂在线观看| 成人免费a级片| 免费在线观看黄色网| 久久一区二区三区四区| av一区二区三区免费| 在线观看视频中文字幕| 毛片一区二区| 91精品国产91久久久久久久久| 日韩在线观看免| 精品黄色一级片| 亚洲欧美www| 午夜男人的天堂| 136福利精品导航| 日韩欧美中文一区二区| 午夜视频在线观| 人人玩人人添人人澡欧美| 日本韩国一区二区三区| 青青草原av在线播放| av有码在线观看| 亚洲午夜在线观看视频在线| 国产人妻人伦精品| h片在线免费| 亚洲欧美日韩国产中文在线| 黄色网址在线免费看| 日本欧美在线视频免费观看| 国产精品久久久久四虎| 一区二区精品视频| 2021av在线| 中文字幕一区免费在线观看| 一区二区三区四区免费视频| 色欧美激情视频在线| 国产精品视频一二三区| 亚洲高清精品中出| 天天影视久久综合| 中文字幕在线一区免费| 9l视频自拍9l视频自拍| 91精选在线| 亚洲国产三级在线| 精品这里只有精品| 都市激情亚洲一区| 欧美午夜寂寞影院| 一级黄色大片儿| 96sao在线精品免费视频| 亚洲成人久久网| 99久久人妻精品免费二区| 欧美亚洲tv| 一区二区成人av| 一起操在线播放| 欧美日韩网站| 欧美一级在线亚洲天堂| 小泽玛利亚一区二区三区视频| 免费观看日韩电影| 亚洲mm色国产网站| 日日躁夜夜躁白天躁晚上躁91| 91影院在线观看| 五月天亚洲综合情| 亚洲大胆人体大胆做受1| 亚洲成av人影院在线观看网| 欧美一级片中文字幕| 日韩黄色碟片| 亚洲国产欧美精品| 国产免费嫩草影院| 黄色日韩在线| 国产精品高潮在线| 国产黄a三级三级看三级| 国产成人精品亚洲777人妖| 精品一区在线播放| 免费高清完整在线观看| 午夜在线电影亚洲一区| 欧美午夜aaaaaa免费视频| 欧美精品三级在线| 亚洲人av在线影院| 青青草原在线免费观看视频| 模特精品在线| 99电影在线观看| 国产在线免费观看| 亚洲一区二区三区国产| 91人人澡人人爽人人精品| 亚洲精品影片| 中文字幕欧美国内| 色婷婷av国产精品| 国产精品一二一区| 日韩中文一区| 国产传媒在线| 91麻豆精品国产自产在线观看一区| 50一60岁老妇女毛片| 欧美韩国日本在线观看| 欧美在线视频观看免费网站| av资源免费看| 亚洲国产高清在线观看视频| 免费看一级大黄情大片| 中文字幕日韩在线| 精品国产一区二区三区久久狼黑人 | 99爱视频在线| 久久综合给合| 中文日韩在线视频| 无码人妻精品一区二| 9人人澡人人爽人人精品| 日本久久高清视频| av日韩一区| 中文字幕久精品免费视频| 精品人妻一区二区三区免费看| 国产成人一级电影| 欧美性受xxxx黑人猛交88| 国产精品成人国产| 在线午夜精品自拍| 国产精品欧美综合| 久久久久成人黄色影片| 妺妺窝人体色www在线小说| 97人人澡人人爽91综合色| 久久国产精品99国产精| 91亚洲精品国偷拍自产在线观看| 国产天堂亚洲国产碰碰| 国产成人久久777777| 日韩高清成人在线| 51ⅴ精品国产91久久久久久| 黑人乱码一区二区三区av| 亚洲一区二区三区激情| 最新版天堂资源在线| 国内精品美女在线观看| 国产精品久久久久免费| 俺来俺也去www色在线观看| 日韩午夜电影在线观看| 免费视频一二三区| 成人污视频在线观看| 丁香六月激情婷婷| 日本久久成人网| 欧洲精品毛片网站| 国产一级二级三级在线观看| 欧美午夜精品久久久久久孕妇| 国产第一页精品| 美女一区二区久久| 精品少妇人妻av一区二区| 欧美三级电影网址| 欧美精品在线观看| 日韩在线观看视频一区| 狠狠躁天天躁日日躁欧美| 国产美女精品久久| 美女视频黄 久久| 免费国产成人看片在线| 99香蕉久久| 欧美亚洲国产日韩2020| 国产日韩精品在线看| 欧美日韩黄色一区二区| avove在线播放| 99久久久久免费精品国产| 北条麻妃av高潮尖叫在线观看| 欧美大黑bbbbbbbbb在线| 91在线国产电影| av在线播放资源| 亚洲一区999| 国产乱淫av免费| 福利微拍一区二区| 美女网站视频色| 成人av在线一区二区三区| 日韩在线xxx| 欧美精品观看| 视频一区国产精品| 亚洲精品不卡在线观看| 欧美亚洲午夜视频在线观看| av中文字幕在线| 欧美videossexotv100| 亚洲国产精品无码久久久| 亚洲视频一区二区在线| 特大黑人巨人吊xxxx| 精品一区二区免费看| 国产欧美日韩网站| 日韩欧美伦理| 久久99九九| 97精品资源在线观看| 8x拔播拔播x8国产精品| 黄色在线视频网站| 亚洲九九九在线观看| 99久久精品无免国产免费| 欧美视频在线免费看| 91精品国产高清一区二区三蜜臀| 国产日韩一级二级三级| 亚洲国产精品狼友在线观看| 免费成人av在线| 黄色av网址在线播放| 亚洲欧美一区在线| 五月天久久狠狠| 亚洲精品456| www.久久草| www欧美在线观看| 国产精品久久久久久久久久久新郎| 黑人玩欧美人三根一起进| 在线成人激情黄色| 无码国产精品一区二区免费16| 欧美视频完全免费看| 国产美女激情视频| 亚洲综合在线观看视频| 日韩一区二区三区四区视频| 久久噜噜亚洲综合| 波多野结衣视频播放| 国产精品1区2区3区| 性生活免费在线观看| 日韩av一二三| 激情网站五月天| 噜噜噜在线观看免费视频日韩 | 日韩国产欧美一区二区三区| 老太脱裤让老头玩ⅹxxxx| 亚洲视频电影在线| 亚洲欧美国产精品桃花| 国产麻豆精品久久| 欧美日韩一区二| 亚洲黄页在线观看| 免费久久久一本精品久久区| 欧洲vs亚洲vs国产| 国产一区二区自拍| 精品欠久久久中文字幕加勒比| 999日本视频| 日韩免费一级| 91丨九色丨国产| 97久久亚洲| 国产精品亚洲不卡a| 波多野结衣在线一区二区| 成人动漫视频在线观看完整版| 在线视频亚洲欧美中文| 国产精品18毛片一区二区| 91麻豆精品激情在线观看最新 | 在线播放第一页| 国产高清精品在线| 日本美女视频网站| 成人的网站免费观看| 这里只有精品在线观看视频| av不卡一区二区三区| 美国黄色a级片| 国产午夜精品在线观看| 国产激情av在线| 亚洲欧洲av另类| 国产女片a归国片aa| 亚洲自拍欧美精品| 日本熟妇毛耸耸xxxxxx| 亚洲v日本v欧美v久久精品| 日韩精品手机在线| 一本大道综合伊人精品热热| 亚洲av人无码激艳猛片服务器| 欧美日韩你懂的| hs视频在线观看| 亚洲成人精品视频在线观看| 久香视频在线观看| 日韩在线视频观看| 国产蜜臀一区二区打屁股调教| 18久久久久久| 国产成人免费| 成人xxxxx色| 国产精品一区二区av日韩在线| 婷婷久久五月天| 欧美午夜免费影院| 茄子视频成人免费观看| 久久成人麻豆午夜电影| 国产精品偷伦视频免费观看了 | 日韩国产在线一区| 午夜av一区| 成人性生活视频免费看| 丝袜美腿高跟呻吟高潮一区| 中文字幕线观看| 成人av在线影院| 911国产在线| 精品人伦一区二区三区蜜桃免费| 亚洲不卡视频在线观看| 69p69国产精品| 欧美日韩国产中文字幕在线| 久久亚洲精品小早川怜子66| 精品丝袜在线| 91社区国产高清| 欧美美女在线| 欧美高清中文字幕| 免费成人在线视频观看| 亚洲国产精品无码久久久久高潮 | 奇米777四色影视在线看| 久久av一区| 国产精品偷伦视频免费观看了| 久久精子c满五个校花| 免费一级全黄少妇性色生活片| 91久久免费观看| 亚洲国产精品18久久久久久| 在线一区二区日韩| 成人欧美一区二区三区的电影| 91九色在线观看| 欧美成人精品一区二区三区在线看| 99精品在线免费视频| 国产成人综合自拍| 熟女少妇内射日韩亚洲| 亚洲h在线观看| 亚洲va久久久噜噜噜无码久久| 色综合影院在线| 欧美性xxx| 精品久久久久久中文字幕动漫| 亚洲在线久久| 天天看片天天操| 亚洲国产高清在线观看视频| 岛国av中文字幕| 亚洲精品xxxx| gogo久久| www 成人av com| 欧美三区不卡| 永久免费黄色片| 亚洲欧洲精品一区二区精品久久久| 最近日韩免费视频| 亚洲小视频在线观看| 亚洲最大网站| 蜜桃精品久久久久久久免费影院| 在线成人亚洲| 毛茸茸free性熟hd| 亚洲成精国产精品女| 亚洲av无码片一区二区三区| 久久视频这里只有精品| 四虎影视国产精品| 伊人久久大香线蕉午夜av| 青椒成人免费视频| 毛片aaaaaa| 欧美精品777| 成人看片免费| 99国产视频| 精品成人一区| 成人免费无码大片a毛片| 午夜av电影一区| 麻豆导航在线观看| 国产精欧美一区二区三区| 国产麻豆一区二区三区精品视频| 日韩毛片在线免费看| 国产婷婷一区二区| 中文字幕男人天堂| 久久精品男人天堂| 免费观看性欧美大片无片| 亚洲中文字幕无码一区二区三区 | 青娱乐精品视频| 精品一区二区在线观看视频| 7777精品伊人久久久大香线蕉经典版下载 | 日韩a在线观看| 国产精品爱久久久久久久| 成人在线免费视频观看| xxww在线观看| 亚洲国产一区在线观看| 天天干免费视频| 国产成一区二区| 91亚洲一区| 9.1在线观看免费| 色综合中文综合网| 午夜小视频在线| 91免费在线观看网站| 99国产精品| av免费播放网站| 日韩欧美国产一区在线观看| 9lporm自拍视频区在线| 欧美一级二级三级| 麻豆成人久久精品二区三区红| 人妻久久一区二区| 日韩黄色av网站| 亚洲欧洲专区| 成人免费观看cn| 国产精品色在线观看| 亚洲国产成人精品一区二区三区| 欧美洲成人男女午夜视频| 四季av一区二区三区免费观看| 制服.丝袜.亚洲.中文.综合懂 | 精品久久久久久久无码| 亚洲欧美色图小说| 亚洲欧美日韩综合在线| 成人欧美一区二区三区在线湿哒哒| 韩日在线一区| 影音先锋男人在线| 亚洲成人激情视频| 日韩深夜福利网站| 精品国产免费av| 亚洲精品视频一区二区| 国产三区四区在线观看|