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

調度線程池ScheduledThreadPoolExecutor源碼解析

開發 前端
ScheduledThreadPoolExecutor可以用來很方便實現我們的調度任務,具體使用可以參考調度線程池ScheduledThreadPoolExecutor的正確使用姿勢這篇文章,那大家知道它是怎么實現的嗎,本文就帶大家來揭曉謎底。

?前言

ScheduledThreadPoolExecutor可以用來很方便實現我們的調度任務,具體使用可以參考調度線程池ScheduledThreadPoolExecutor的正確使用姿勢這篇文章,那大家知道它是怎么實現的嗎,本文就帶大家來揭曉謎底。

實現機制分析

我們先思考下,如果讓大家去實現ScheduledThreadPoolExecutor可以周期性執行任務的功能,需要考慮哪些方面呢?

  • ScheduledThreadPoolExecutor的整體實現思路是什么呢?

答:我們是不是可以繼承線程池類,按照線程池的思路,將任務先丟到阻塞隊列中,等到時間到了,工作線程就從阻塞隊列獲取任務執行。

  • 如何實現等到了未來的時間點就開始執行呢?

答:我們可以根據參數獲取這個任務還要多少時間執行,那么我們是不是可以從阻塞隊列中獲取任務的時候,通過條件隊列的的awaitNanos(delay)方法,阻塞一定時間。

  • 如何實現 任務的重復性執行呢?

答:這就更加簡單了,任務執行完成后,把它再次加入到隊列不就行了嗎。

圖片

源碼解析

類結構圖

圖片

ScheduledThreadPoolExecutor?的類結構圖如上圖所示,很明顯它是在我們的線程池ThreadPoolExecutor框架基礎上擴展的。

  • ScheduledExecutorService:實現了該接口,封裝了調度相關的API
  • ThreadPoolExecutor:繼承了該類,保留了線程池的能力和整個實現的框架
  • DelayedWorkQueue:內部類,延遲阻塞隊列。
  • ScheduledFutureTask:延遲任務對象,包含了任務、任務狀態、剩余的時間、結果等信息。

重要屬性

通過ScheduledThreadPoolExecutor類的成員屬性,我們可以了解它的數據結構。

  • shutdown 后是否繼續執行周期任務(重復執行)
private volatile boolean continueExistingPeriodicTasksAfterShutdown;
  • shutdown 后是否繼續執行延遲任務(只執行一次)
private volatile boolean executeExistingDelayedTasksAfterShutdown = true;
  • 調用cancel()方法后,是否將該任務從隊列中移除,默認false
private volatile boolean removeOnCancel = false;
  • 任務的序列號,保證FIFO隊列的順序,用來比較優先級
private static final AtomicLong sequencer = new AtomicLong()
  • ScheduledFutureTask延遲任務類

ScheduledFutureTask? 繼承 FutureTask?,實現 RunnableScheduledFuture? 接口,無論是 runnable? 還是 callable?,無論是否需要延遲和定時,所有的任務都會被封裝成 ScheduledFutureTask。

該類具有延遲執行的特點, 覆蓋FutureTask? 的 run 方法來實現對延時執行、周期執行的支持。

對于延時任務調用FutureTask#run?,而對于周期性任務則調用FutureTask#runAndReset? 并且在成功之后根據 fixed-delay/fixed-rate模式來設置下次執行時間并重新將任務塞到工作隊列。

成員屬性如下:

// 任務序列號
private final long sequenceNumber;
// 任務可以被執行的時間,交付時間,以納秒表示
private long time;
// 0 表示非周期任務
// 正數表示 fixed-rate(兩次開始啟動的間隔)模式的周期,
// 負數表示 fixed-delay(一次執行結束到下一次開始啟動) 模式
private final long period;
// 執行的任務對象
RunnableScheduledFuture<V> outerTask = this;
// 任務在隊列數組中的索引下標, -1表示刪除
int heapIndex;
  • DelayedWorkQueue延遲隊列

DelayedWorkQueue 是支持延時獲取元素的阻塞隊列, 內部采用優先隊列 PriorityQueue(小根堆、滿二叉樹)存儲元素。

內部數據結構是數組,所以延遲隊列出隊頭元素后需要讓其他元素(尾)替換到頭節點,防止空指針異常。

成員屬性如下:

// 初始容量
private static final int INITIAL_CAPACITY = 16;
// 節點數量
private int size = 0;
// 存放任務的數組
private RunnableScheduledFuture<?>[] queue =
new RunnableScheduledFuture<?>[INITIAL_CAPACITY];
// 控制并發用的鎖
private final ReentrantLock lock = new ReentrantLock();
// 條件隊列
private final Condition available = lock.newCondition();
//指定用于等待隊列頭節點任務的線程
private Thread leader = null;

提交延遲任務schedule()原理

延遲執行方法,并指定延遲執行的時間,只會執行一次。

  • schedule()方法是延遲任務方法的入口。
public ScheduledFuture<?> schedule(Runnable command,
long delay,
TimeUnit unit) {
// 判空處理
if (command == null || unit == null)
throw new NullPointerException();
// 將外部傳入的任務封裝成延遲任務對象ScheduledFutureTask
RunnableScheduledFuture<?> t = decorateTask(command,
new ScheduledFutureTask<Void>(command, null,
triggerTime(delay, unit)));
// 執行延遲任務
delayedExecute(t);
return t;
}
  • decorateTask(...) 該方法是封裝延遲任務

調用triggerTime(delay, unit)方法計算延遲的時間。

// 返回【當前時間 + 延遲時間】,就是觸發當前任務執行的時間
private long triggerTime(long delay, TimeUnit unit) {
// 設置觸發的時間
return triggerTime(unit.toNanos((delay < 0) ? 0 : delay));
}
long triggerTime(long delay) {
// 如果 delay < Long.Max_VALUE/2,則下次執行時間為當前時間 +delay
// 否則為了避免隊列中出現由于溢出導致的排序紊亂,需要調用overflowFree來修正一下delay
return now() + ((delay < (Long.MAX_VALUE >> 1)) ? delay : overflowFree(delay));
}

// 下面這種情況很少,大家看不懂可以不用強行理解
// 如果某個任務的 delay 為負數,說明當前可以執行(其實早該執行了)。
// 阻塞隊列中維護任務順序是基于 compareTo 比較的,比較兩個任務的順序會用 time 相減。
// 那么可能出現一個 delay 為正數減去另一個為負數的 delay,結果上溢為負數,則會導致 compareTo 產生錯誤的結果
private long overflowFree(long delay) {
Delayed head = (Delayed) super.getQueue().peek();
if (head != null) {
long headDelay = head.getDelay(NANOSECONDS);
// 判斷一下隊首的delay是不是負數,如果是正數就不用管,怎么減都不會溢出
// 否則拿當前 delay 減去隊首的 delay 來比較看,如果不出現上溢,排序不會亂
// 不然就把當前 delay 值給調整為 Long.MAX_VALUE + 隊首 delay
if (headDelay < 0 && (delay - headDelay < 0))
delay = Long.MAX_VALUE + headDelay;
}
return delay;
}
  • 調用RunnableScheduledFuture的構造方法封裝為延遲任務
ScheduledFutureTask(Runnable r, V result, long ns) {
super(r, result);
// 任務的觸發時間
this.time = ns;
// 任務的周期, 延遲任務的為0,因為不需要重復執行
this.period = 0;
// 任務的序號 + 1
this.sequenceNumber = sequencer.getAndIncrement();
}
  • 調用decorateTask()方法裝飾延遲任務
// 沒有做任何操作,直接將 task 返回,該方法主要目的是用于子類擴展
protected <V> RunnableScheduledFuture<V> decorateTask(
Runnable runnable, RunnableScheduledFuture<V> task) {
return task;
}

提交周期任務scheduleAtFixedRate()原理

按照固定的頻率周期性的執行任務,捕手renwu,一次任務的啟動到下一次任務的啟動的間隔

public ScheduledFuture<?> scheduleAtFixedRate(Runnable command, long initialDelay, long period,
TimeUnit unit) {
if (command == null || unit == null)
throw new NullPointerException();
if (period <= 0)
throw new IllegalArgumentException();
// 任務封裝,【指定初始的延遲時間和周期時間】
ScheduledFutureTask<Void> sft =new ScheduledFutureTask<Void>(command, null,
triggerTime(initialDelay, unit), unit.toNanos(period));
// 默認返回本身
RunnableScheduledFuture<Void> t = decorateTask(command, sft);
sft.outerTask = t;
// 開始執行這個任務
delayedExecute(t);
return t;
}

提交周期任務scheduleWithFixedDelay()原理

按照指定的延時周期性執行任務,上一個任務執行完畢后,延時一定時間,再次執行任務。

public ScheduledFuture<?> scheduleWithFixedDelay(Runnable command, long initialDelay, long delay,
TimeUnit unit) {
if (command == null || unit == null)
throw new NullPointerException();
if (delay <= 0)
throw new IllegalArgumentException();
// 任務封裝,【指定初始的延遲時間和周期時間】,周期時間為 - 表示是 fixed-delay 模式
ScheduledFutureTask<Void> sft = new ScheduledFutureTask<Void>(command, null,
triggerTime(initialDelay, unit), unit.toNanos(-delay));
RunnableScheduledFuture<Void> t = decorateTask(command, sft);
sft.outerTask = t;
// 開始執行這個任務
delayedExecute(t);
return t;
}

執行任務delayedExecute(t)原理

上面多種提交任務的方式,殊途同歸,最終都會調用delayedExecute()方法執行延遲或者周期任務。

delayedExecute()方法是執行延遲任務的入口

private void delayedExecute(RunnableScheduledFuture<?> task) {
// 線程池是 SHUTDOWN 狀態,執行拒絕策略
if (isShutdown())
// 調用拒絕策略的方法
reject(task);
else {
// 把當前任務放入阻塞隊列
super.getQueue().add(task);
// 線程池狀態為 SHUTDOWN 并且不允許執行任務了,就從隊列刪除該任務,并設置任務的狀態為取消狀態
// 非主流程,可以跳過,不重點看了
if (isShutdown() && !canRunInCurrentRunState(task.isPeriodic()) && remove(task))
task.cancel(false);
else
// 開始執行了哈
ensurePrestart();
}
}

ensurePrestart()方法開啟線程執行

// ThreadPoolExecutor#ensurePrestart
void ensurePrestart() {
int wc = workerCountOf(ctl.get());
// worker數目小于corePoolSize,則添加一個worker。
if (wc < corePoolSize)
// 第二個參數 true 表示采用核心線程數量限制,false 表示采用 maximumPoolSize
addWorker(null, true);
// corePoolSize = 0的情況,至少開啟一個線程,【擔保機制】
else if (wc == 0)
addWorker(null, false);
}

addWorker()?方法實際上父類ThreadPoolExecutor的方法,這個方法在該文章 Java線程池源碼深度解析中詳細介紹過,這邊做個總結:

  • 如果線程池中工作線程數量小于最大線程數,創建工作線程,執行任務。
  • 如果線程池中工作線程數量大于最大線程數,直接返回。

獲取延遲任務take()原理

目前工作線程已經創建好了,工作線程開始工作了,它會從阻塞隊列中獲取延遲任務執行,這部分也是線程池里面的原理,不做展開,那我們看下它是如何實現延遲執行的? 主要關注如何從阻塞隊列中獲取任務。

  • DelayedWorkQueue#take()方法獲取延遲任務

該方法會在上面的addWoker()?方法創建工作線程后,工作線程中循環持續調用workQueue.take()方法獲取延遲任務。

該方法主要獲取延遲隊列中任務延遲時間小于等于0 的任務。

如果延遲時間不小于0,那么調用條件隊列的awaitNanos(delay)阻塞方法等待一段時間,等時間到了,延遲時間自然小于等于0了。

獲取到任務后,工作線程就可以開始執行調度任務了。

// DelayedWorkQueue#take()
public RunnableScheduledFuture<?> take() throws InterruptedException {
final ReentrantLock lock = this.lock;
// 加可中斷鎖
lock.lockInterruptibly();
try {
// 自旋
for (;;) {
// 獲取阻塞隊列中的頭結點
RunnableScheduledFuture<?> first = queue[0];
// 如果阻塞隊列沒有數據,為空
if (first == null)
// 等待隊列不空,直至有任務通過 offer 入隊并喚醒
available.await();
else {
// 獲取頭節點的的任務還剩余多少時間才執行
long delay = first.getDelay(NANOSECONDS);
if (delay <= 0)
// 到達觸發時間,獲取頭節點并調整堆,重新選擇延遲時間最小的節點放入頭部
return finishPoll(first);

// 邏輯到這說明頭節點的延遲時間還沒到
first = null;
// 說明有 leader 線程在等待獲取頭節點,當前線程直接去阻塞等待
if (leader != null)
// 當前線程阻塞
available.await();
else {
// 沒有 leader 線程,【當前線程作為leader線程,并設置頭結點的延遲時間作為阻塞時間】
Thread thisThread = Thread.currentThread();
leader = thisThread;
try {
// 當前線程通過awaitNanos方法等待delay時間后,會自動喚醒,往后面繼續執行
available.awaitNanos(delay);
// 到達阻塞時間時,當前線程會從這里醒來,進入下一輪循環,就有可能執行了
} finally {
// t堆頂更新,leader 置為 null,offer 方法釋放鎖后,
// 有其它線程通過 take/poll 拿到鎖,讀到 leader == null,然后將自身更新為leader。
if (leader == thisThread)
// leader 置為 null 用以接下來判斷是否需要喚醒后繼線程
leader = null;
}
}
}
}
} finally {
// 沒有 leader 線程并且頭結點不為 null,喚醒阻塞獲取頭節點的線程,
// 【如果沒有這一步,就會出現有了需要執行的任務,但是沒有線程去執行】
if (leader == null && queue[0] != null)
available.signal();
// 解鎖
lock.unlock();
}
}
  • finishPoll()方法獲取到任務后執行

該方法主要做兩個事情, 獲取頭節點并調整堆,重新選擇延遲時間最小的節點放入頭部。

private RunnableScheduledFuture<?> finishPoll(RunnableScheduledFuture<?> f) {
// 獲取尾索引
int s = --size;
// 獲取尾節點
RunnableScheduledFuture<?> x = queue[s];
// 將堆結構最后一個節點占用的 slot 設置為 null,因為該節點要嘗試升級成堆頂,會根據特性下調
queue[s] = null;
// s == 0 說明 當前堆結構只有堆頂一個節點,此時不需要做任何的事情
if (s != 0)
// 從索引處 0 開始向下調整
siftDown(0, x);
// 出隊的元素索引設置為 -1
setIndex(f, -1);
return f;
}

延遲任務運行的原理

從延遲隊列中獲取任務后,工作線程會調用延遲任務的run()方法執行任務。

  • ScheduledFutureTask#run()方法運行任務

調用isPeriodic()方法判斷任務是否是周期性任務還是非周期性任務

如果任務是非周期任務,就調用父類的FutureTask#run()執行一次

如果任務是非周期任務,就調用父類的FutureTask#runAndReset(), 返回true會設置下一次的執行時間,重新放入線程池的阻塞隊列中,等待下次獲取執行

public void run() {
// 是否周期性,就是判斷 period 是否為 0
boolean periodic = isPeriodic();
// 根據是否是周期任務檢查當前狀態能否執行任務,不能執行就取消任務
if (!canRunInCurrentRunState(periodic))
cancel(false);
// 非周期任務,直接調用 FutureTask#run 執行一次
else if (!periodic)
ScheduledFutureTask.super.run();
// 周期任務的執行,返回 true 表示執行成功
else if (ScheduledFutureTask.super.runAndReset()) {
// 設置周期任務的下一次執行時間
setNextRunTime();
// 任務的下一次執行安排,如果當前線程池狀態可以執行周期任務,加入隊列,并開啟新線程
reExecutePeriodic(outerTask);
}
}
  • FutureTask#runAndReset()執行周期性任務

周期任務正常完成后任務的狀態不會變化,依舊是 NEW,不會設置 outcome 屬性。

但是如果本次任務執行出現異常,會進入 setException 方法將任務狀態置為異常,把異常保存在 outcome 中。

方法返回 false,后續的該任務將不會再周期的執行

protected boolean runAndReset(){
// 任務不是新建的狀態了,或者被別的線程執行了,直接返回 false
if (state != NEW ||
!UNSAFE.compareAndSwapObject(this, runnerOffset, null, Thread.currentThread()))
return false;
boolean ran = false;
int s = state;
try {
Callable<V> c = callable;
if (c != null && s == NEW) {
try {
// 執行方法,沒有返回值
c.call();
ran = true;
} catch (Throwable ex) {
// 出現異常,把任務設置為異常狀態,喚醒所有的 get 阻塞線程
setException(ex);
}
}
} finally {
// 執行完成把執行線程引用置為 null
runner = null;
s = state;
// 如果線程被中斷進行中斷處理
if (s >= INTERRUPTING)
handlePossibleCancellationInterrupt(s);
}
// 如果正常執行,返回 true,并且任務狀態沒有被取消
return ran && s == NEW;
}
  • ScheduledFutureTask#setNextRunTime()設置下次執行時間

如果屬性period大于0,表示fixed-rate模式,直接加上period時間即可。

如果屬性period小于等于0, 表示是fixed-delay模式, 調用triggerTime重新計算下次時間。

// 任務下一次的觸發時間
private void setNextRunTime() {
long p = period;
if (p > 0)
// fixed-rate 模式,【時間設置為上一次執行任務的時間 + p】,兩次任務執行的時間差
time += p;
else
// fixed-delay 模式,下一次執行時間是【當前這次任務結束的時間(就是現在) + delay 值】
time = triggerTime(-p);
}
  • ScheduledFutureTask#reExecutePeriodic(),重新放入阻塞任務隊列,等待獲取,進行下一輪執行
// ScheduledThreadPoolExecutor#reExecutePeriodic
void reExecutePeriodic(RunnableScheduledFuture<?> task) {
if (canRunInCurrentRunState(true)) {
// 【放入任務隊列】
super.getQueue().add(task);
// 如果提交完任務之后,線程池狀態變為了 shutdown 狀態,需要再次檢查是否可以執行,
// 如果不能執行且任務還在隊列中未被取走,則取消任務
if (!canRunInCurrentRunState(true) && remove(task))
task.cancel(false);
else
// 當前線程池狀態可以執行周期任務,加入隊列,并【根據線程數量是否大于核心線程數確定是否開啟新線程】
ensurePrestart();
}
}

責任編輯:武曉燕 來源: JAVA旭陽
相關推薦

2025-09-24 18:39:45

2015-10-10 09:39:42

Java線程池源碼解析

2013-06-08 10:11:31

Java線程池架構

2021-05-26 11:30:24

Java線程池代碼

2013-06-08 13:07:23

Java線程池調度器

2013-05-28 13:57:12

MariaDB

2011-06-22 15:50:45

QT 線程

2020-11-25 11:33:47

Java線程技術

2020-12-10 07:00:38

編程線程池定時任務

2020-12-08 08:53:53

編程ThreadPoolE線程池

2023-12-29 09:38:00

Java線程池

2011-08-19 17:36:42

iPhone操作隊列Java

2018-10-31 15:54:47

Java線程池源碼

2023-12-28 07:49:11

線程池源碼應用場景

2021-11-10 16:10:18

鴻蒙HarmonyOS應用

2024-01-29 15:54:41

Java線程池公平鎖

2024-05-06 00:00:00

ThreadPool線程調度

2023-05-19 08:01:24

Key消費場景

2023-11-26 18:54:29

Linux調度器

2024-07-15 08:20:24

點贊
收藏

51CTO技術棧公眾號

日韩在线视频二区| 色婷婷综合久久久久中文| 99在线影院| 久草视频在线观| 国产成人三级| 欧美日韩一区 二区 三区 久久精品| 天堂社区 天堂综合网 天堂资源最新版| 天天射天天干天天| 亚洲影视一区| 亚洲精品一区二区网址| 羞羞的视频在线| 金瓶狂野欧美性猛交xxxx| 91免费视频网| 91热精品视频| 国产精品免费无遮挡无码永久视频| 婷婷亚洲五月色综合| 亚洲国产中文字幕在线观看| 国产一二三区av| 1024在线看片你懂得| 国产精品三级视频| 国产欧美欧洲| 99草在线视频| 丝袜美腿一区二区三区| 欧美激情国内偷拍| 人妻无码一区二区三区免费| 欧美黑人巨大videos精品| 欧美精品一二三| 日本免费一级视频| 啦啦啦中文在线观看日本| 国产精品视频一二三| 精品国产aⅴ麻豆| 国产黄色美女视频| 蜜桃91丨九色丨蝌蚪91桃色| 欧美亚洲国产视频小说| 久久久久久蜜桃| 亚洲91视频| 综合136福利视频在线| 中文字幕一区二区人妻在线不卡| 综合欧美亚洲| 日韩欧美一卡二卡| 免费网站在线观看黄| 在线一区视频观看| 色欧美88888久久久久久影院| 日本欧美视频在线观看| 日本天码aⅴ片在线电影网站| 中文字幕在线不卡一区二区三区| 日本中文不卡| 国产高清视频在线观看| 久久久久久久性| 久久久久高清| 三级理论午夜在线观看| 99久久夜色精品国产网站| 翡翠波斯猫1977年美国| 亚洲av综合色区无码一二三区| 国内成人免费视频| 51国产成人精品午夜福中文下载| 国产精品怡红院| 精品一区二区综合| 91亚洲精品久久久久久久久久久久| 这里只有久久精品视频| 蜜桃视频一区二区三区| 国产精品亚洲аv天堂网| 国产成人麻豆免费观看| 美女视频一区二区| 成人黄色av网站| 国产福利第一视频| 国产精品1区2区3区| 高清视频一区二区三区| 四虎永久在线观看| 2014亚洲片线观看视频免费| 欧美午夜精品理论片a级大开眼界| 日韩专区一区二区| 亚洲国产成人私人影院tom| 天堂社区 天堂综合网 天堂资源最新版| www免费网站在线观看| 国产精品久久久久久久久果冻传媒| 亚洲日本无吗高清不卡| 中文字幕在线播放网址| 偷拍与自拍一区| 午夜肉伦伦影院| 免费成人毛片| 精品日韩一区二区| 精品国产av无码| 国产伦一区二区三区| 日韩中文字幕视频在线观看| 免费人成视频在线| 国产亚洲综合精品| 国产精品视频网站| 理论片中文字幕| 国产网站一区二区| 亚洲成人动漫在线| 亚洲天堂手机| 555夜色666亚洲国产免| 中文成人无字幕乱码精品区| 国产欧美日韩在线一区二区 | 韩剧1988在线观看免费完整版| 欧美精品亚洲精品日韩精品| 日韩高清国产一区在线| 91国产丝袜在线放| 久草视频在线看| 一区二区三区加勒比av| 欧美 日韩精品| 视频一区国产| 在线成人激情黄色| 九九九国产视频| 六月丁香婷婷色狠狠久久| 国产99在线免费| 欧美成人高清在线| 午夜精品久久久久久久久| av在线网址导航| 亚洲第一论坛sis| 九九久久综合网站| 最近中文字幕在线观看视频| 99精品国产99久久久久久白柏| 亚洲一区二区三区欧美| 中国色在线日|韩| 日韩一区二区不卡| 亚洲黄色网址大全| 午夜亚洲影视| 国产精品久久国产精品| 黄色在线论坛| 欧美视频在线一区二区三区| aaaaa级少妇高潮大片免费看| 综合天天久久| 国产日韩精品在线播放| 国产中文在线| 日韩欧美在线国产| 在线黄色免费网站| 欧美精品麻豆| 91最新在线免费观看| av成人手机在线| 色天使久久综合网天天| 久久久久久久久久久国产精品| 欧美日本精品| 91亚洲人电影| 福利在线视频网站| 欧美精品一级二级三级| 天天舔天天操天天干| 久久精品男女| 欧美日韩另类丝袜其他| 亚洲优女在线| 亚洲美女性视频| 亚洲日本视频在线观看| 91丝袜美腿高跟国产极品老师| a天堂资源在线观看| 日本少妇精品亚洲第一区| 久久黄色av网站| 91国偷自产中文字幕久久| 国产精品乱码妇女bbbb| 亚洲少妇久久久| 成人精品影院| 国产欧美婷婷中文| 久久77777| 日韩视频一区二区三区在线播放| 日本黄色片免费观看| 韩国毛片一区二区三区| 欧美日韩午夜爽爽| 99re6热只有精品免费观看| 欧美肥婆姓交大片| 丰满少妇高潮在线观看| 亚洲国产aⅴ成人精品无吗| 稀缺小u女呦精品呦| 亚洲国产国产亚洲一二三| 精品日本一区二区三区| 中文不卡1区2区3区| 国产午夜精品全部视频在线播放| 无码任你躁久久久久久久| 亚洲国产电影在线观看| 婷婷中文字幕在线观看| 欧美亚洲不卡| 麻豆精品传媒视频| 日本成人一区二区| 久久99热精品这里久久精品| 人妻精品一区二区三区| 日韩欧美在线网址 | 日韩午夜影院| 91国偷自产一区二区开放时间 | 91国偷自产一区二区开放时间 | 亚洲小说欧美另类社区| 精品乱子伦一区二区三区| 欧美日韩精品免费观看视完整| 一色桃子一区二区| a天堂视频在线| 天天综合色天天综合色h| 色一情一交一乱一区二区三区 | 毛片在线视频| 亚洲国产精品字幕| 亚洲视屏在线观看| 亚洲午夜视频在线观看| 欧洲美一区二区三区亚洲| 国产在线播放一区| 日本十八禁视频无遮挡| 日韩欧美高清在线播放| 国产经品一区二区| 78精品国产综合久久香蕉| 欧美激情亚洲综合一区| 国产女主播在线直播| 日韩视频中午一区| 国产午夜无码视频在线观看| 一区二区三区免费| 中文字幕av久久爽一区| 成人高清免费观看| 亚洲一区二区在线视频观看| 99精品热视频只有精品10| 中文精品视频一区二区在线观看| 久久九九热re6这里有精品| 国产精品三级久久久久久电影| 免费看电影在线| 影音先锋日韩有码| 午夜小视频免费| 日韩一级二级三级| 最近中文字幕在线观看| 岛国精品视频在线播放| 欧美三级小视频| 亚洲国产精品成人久久综合一区| 国模私拍在线观看| 国产成人亚洲综合a∨婷婷图片| 国产三级日本三级在线播放| 亚洲区第一页| 日本久久久网站| 97欧美在线视频| 天堂精品一区二区三区| 亚洲专区视频| 免费看国产精品一二区视频| aiai久久| 999在线观看免费大全电视剧| 成人国产激情在线| 国产aaa精品| 日韩电影免费看| 97超碰色婷婷| heyzo高清国产精品| 欧美成人免费小视频| 香蕉视频免费在线播放| 亚洲一区999| 裸体xxxx视频在线| 国产偷国产偷亚洲清高网站| 日韩有码第一页| 亚洲精品一线二线三线无人区| 国产情侣激情自拍| 欧美一区二区美女| 国产视频一区二区三| 在线不卡a资源高清| 亚洲一区二区色| 欧美欧美午夜aⅴ在线观看| 在线观看免费视频a| 欧美三级视频在线| 一级aaaa毛片| 制服丝袜中文字幕一区| 国产乱码精品一区二区| 91精品国产麻豆| jizz中国女人| 精品国产亚洲在线| 人人妻人人澡人人爽久久av | 欧美性色欧美a在线播放| 色老头在线视频| 欧美性xxxxxx少妇| 亚洲性在线观看| 欧美一区三区四区| 性少妇videosexfreexxx片| 欧美一级片在线| 国模私拍视频在线| 日韩第一页在线| 国产在线超碰| 久久精品2019中文字幕| 最爽无遮挡行房视频在线| 欧美激情亚洲精品| 裤袜国产欧美精品一区| 国产精品日韩av| 久久免费福利| 精品久久久久久一区| 蜜桃成人av| 色噜噜狠狠一区二区三区| 99久久久国产精品美女| 日本福利视频网站| 亚洲欧美成人综合| 艹b视频在线观看| 福利一区在线观看| 91精品人妻一区二区| 成人免费在线播放视频| 久久久久久久久久一区二区三区| 欧美性xxxx极品hd满灌| 亚洲天天综合网| 亚洲国产中文字幕在线观看| 国产三级在线看| 久久99精品国产99久久6尤物 | 欧美日韩国产丝袜美女| 中文字幕你懂的| 精品毛片乱码1区2区3区| 国产专区在线播放| 欧美国产日本在线| 免费高清视频在线一区| 国产66精品久久久久999小说| 久久av超碰| www.18av.com| 免费成人美女在线观看| 四虎国产精品永久免费观看视频| 97久久久精品综合88久久| 黑人と日本人の交わりビデオ| 亚洲一区二区三区四区在线免费观看| 免费看毛片网站| 日韩亚洲电影在线| av每日在线更新| 国内免费久久久久久久久久久 | 久久久久久久久久97| 婷婷开心激情综合| 国产日韩欧美一区二区东京热 | 蜜桃久久av| 亚洲性图第一页| 中文无字幕一区二区三区 | 任你弄在线视频免费观看| 国产极品精品在线观看| 91精品丝袜国产高跟在线| 亚洲国产精品一区在线观看不卡| 亚洲欧洲一区二区天堂久久| 中文字幕第22页| 欧美激情一区二区三区不卡| 日韩激情一区二区三区| 555www色欧美视频| 成人高清免费在线播放| 欧美一级视频免费在线观看| 中文字幕一区二区三区四区久久 | 日韩视频免费观看高清完整版在线观看 | 精品一区二区免费在线观看| 给我看免费高清在线观看| 一区二区三区视频在线观看| 在线观看免费视频a| 一区二区三欧美| 波多野结衣久久精品| 韩国一区二区三区美女美女秀| 99久久婷婷这里只有精品| 天天操天天摸天天爽| 久久久久久久久久美女| 特级毛片www| 亚洲精品99久久久久| 麻豆av在线免费观看| 不卡视频一区二区| 欧美激情成人在线| 亚洲国产欧美91| 亚洲精品第1页| 精品人妻aV中文字幕乱码色欲| 久久精品国产成人| 一区二区三区无毛| 国产又大又长又粗又黄| 经典三级在线一区| 日韩三级久久久| 欧美精品乱码久久久久久| 欧美激情免费| 91免费看蜜桃| 黄色精品免费| 精品国产av色一区二区深夜久久| 亚洲大型综合色站| 日韩在线观看视频网站| 97在线观看免费| 亚洲aaa级| www.超碰com| 国产精品福利一区二区| 国产精品久久久久久久一区二区| 理论片在线不卡免费观看| 国产在线不卡一区二区三区| 免费极品av一视觉盛宴| 成人高清免费观看| 国产suv精品一区二区33| 国产一区二区三区三区在线观看| 91欧美精品| av久久久久久| 99精品在线观看视频| 波多野结衣小视频| 久久精品一区中文字幕| 97久久综合区小说区图片区| 美女日批免费视频| 亚洲国产精品ⅴa在线观看| 国产成人毛毛毛片| 欧美最顶级的aⅴ艳星| 日韩成人影院| 中文在线字幕观看| 日韩欧美国产骚| 麻豆影院在线| 狠狠色综合色区| 琪琪一区二区三区| 久久久一二三区| 国产网站欧美日韩免费精品在线观看 | 亚洲狠狠爱一区二区三区| 手机福利小视频在线播放| 国产免费一区二区三区在线能观看| 91精品秘密在线观看| chinese麻豆新拍video| 欧美无乱码久久久免费午夜一区| 在线免费观看污| 欧美一区二区三区在线播放| 国内国产精品久久| 无码一区二区三区| 欧美成人国产va精品日本一级| 欧美三级自拍| 天堂av2020| 色诱视频网站一区| 欧美人与禽猛交乱配| 视频在线99| 99久久国产综合精品麻豆| 国产精品久久无码一三区| 欧美亚洲视频在线看网址|