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

優雅的關閉Java線程池,這樣做才是yyds

開發
想要優雅的關閉線程池,首先要理解線程中斷的含義。

1 背景

某年某月某日,和我的臥龍同事聊一個需求,說是有個數據查詢的功能,因為涉及到多個第三方接口調用,想用線程池并行來做。

很正常的一個方案,但是上線后發現,每次服務發布的時候,這個數據查詢的功能就會掛掉,后來發現是線程池沒有做好關閉,這里總結一下。

關鍵字:線程池;shutdown;shutdownNow;interrupt

2 線程中斷 interrupt

先補一補基礎的知識:線程中斷。

線程中斷的含義,并不是強制把運行中的線程給“咔嚓”中斷,而是把線程的中斷標志位置為true,這樣等線程之后阻塞(wait、join、sleep)的時候,就會拋出 InterruptedException,程序通過捕獲 InterruptedException 來做一定的善后處理,然后讓線程退出。

來看個例子,下面這段代碼是起一個線程,打印一百行文本,打印過程中,會把線程的中斷標志位置為true

public static void test02() throws InterruptedException {

    Thread t = new Thread(() -> {
    for (int i = 0; i < 100; i++) {
        System.out.println("process i=" + i + ",interrupted:" + Thread.currentThread().isInterrupted());
    }
    });
    t.start();
    Thread.sleep(1);
    t.interrupt();
}

看看控制臺的輸出,發現在打印到 57 的時候,中斷標志位已經成功置為true了,但是線程任然在打印,說明只是設置了中斷標志位,而不是直接粗暴的把線程中斷。

...

process i=55,interrupted:false

process i=56,interrupted:false

process i=57,interrupted:true

process i=58,interrupted:true

process i=59,interrupted:true

...

再看看這個示例,同樣是打印一百行文本,打印過程中會判斷中斷標志位,如果中斷就自行退出。

public static void test02() throws InterruptedException {

    Thread t = new Thread(() -> {
    for (int i = 0; i < 100; i++) {
        if (Thread.interrupted()) {
            System.out.println("線程已中斷,退出執行");
            break;
        }
        System.out.println("process i=" + i + ",interrupted:" + Thread.currentThread().isInterrupted());
    }
    });
    t.start();
    Thread.sleep(1);
    t.interrupt();
}

控制臺輸出如下,:

process i=49,interrupted:false

process i=50,interrupted:false

process i=51,interrupted:false

線程已中斷,退出執行

3 線程池的關閉 shutdown 方法

了解完線程中斷,再來看看線程池的關閉方法。

關閉線程池有兩個方法 shutdown()  shutdownNow(),具體有什么區別?我們先來看看 shutdown() 方法

/**
 * Initiates an orderly shutdown in which previously submitted
 * tasks are executed, but no new tasks will be accepted.
 * Invocation has no additional effect if already shut down.
 *
 * <p>This method does not wait for previously submitted tasks to
 * complete execution.  Use {@link #awaitTermination awaitTermination}
 * to do that.
 *
 * @throws SecurityException {@inheritDoc}
 */
public void shutdown() {
    final ReentrantLock mainLock = this.mainLock;
    mainLock.lock();
    try {
        checkShutdownAccess();
        advanceRunState(SHUTDOWN); // 1. 把線程池的狀態設置為 SHUTDOWN
        interruptIdleWorkers(); // 2. 把空閑的工作線程置為中斷
        onShutdown(); // 3. 一個空實現,暫不用關注
    } finally {
        mainLock.unlock();
    }
    tryTerminate();
}

看源碼先看注釋,我用我英語四級的超高水準水平翻譯下:

啟動有序關閉會執行以前提交的任務,但不接受任何新任務。

如果已經關閉,則調用不會產生額外的影響。

此方法不等待活動執行的任務終止。如果需要,可使用 awaitTermination() 做到這一點。

3.1 第一步:advanceRunState(SHUTDOWN) 把線程池置為 SHUTDOWN

線程池狀態流轉如下。調用 shutdown() 方法會把線程池的狀態置為 SHUTDOWN,后續再往線程池提交任務就會被拒絕(execute() 方法中做了判斷)。

3.2 第二步:interruptIdleWorkers() 把空閑的工作線程置為中斷

interruptIdleWorkers() 方法遍歷所有的工作線程,如果 tryLock() 成功,就把線程置為中斷。

這里,如果 tryLock() 成功,說明對應的 woker 是一個空閑的,沒有在執行任務的線程,如果沒成功,說明對應的 worker 正在執行任務。也就是說,這里的中斷,對正在執行中的任務并沒有影響。

private void interruptIdleWorkers(boolean onlyOne) {
    final ReentrantLock mainLock = this.mainLock;
    mainLock.lock();
    try {
        for (Worker w : workers) {
            Thread t = w.thread;
            if (!t.isInterrupted() && w.tryLock()) {
                try {
                    t.interrupt();
                } catch (SecurityException ignore) {
                } finally {
                    w.unlock();
                }
            }
            if (onlyOne)
                break;
        }
    } finally {
        mainLock.unlock();
    }
}

3.3 第三步:onShutdown() 一個空實現,暫不用關注

這個沒啥,就是個留空的方法。

3.4 總結

shutdown() 方法干兩件事:

  1. 把線程池狀態置為 SHUTDOWN 狀態
  2. 中斷空閑線程

我們來看個例子,加深下印象。

public static void test01() throws InterruptedException {

    // corePoolSize 是 2,maximumPoolSize 是 2
    ThreadPoolExecutor es = new ThreadPoolExecutor(2, 2,
            60L, TimeUnit.SECONDS,
            new LinkedBlockingQueue<>());
    es.prestartAllCoreThreads(); // 啟動所有 worker
    es.execute(new Task()); // Task是一個訪問某網站的 HTTP 請求,跑的慢,后面會貼出來完整代碼,這里把他當做一個跑的慢的異步任務就行
    es.shutdown();
    es.execute(new Task()); // 在線程池 shutdown() 后 繼續添加任務,這里預期是拋出異常
}

這個例子我們主要觀察兩個現象。

一個是線程池會有兩個woker( prestartAllCoreThreads() 方法的調用使得已啟動就有兩個 worker),其中一個正在執行,一個處于空閑。 所以當調用shutdown() 方法,走進 interruptIdleWorkers() 的時候,只有那個空閑的線程會調用 t.interrupt()

第二個是調用 shutdown() 方法后,再調用 execute() 時,會拋出異常,因為線程池的狀態已經置為 SHUTDOWN,不再接受新的任務添加進來。

4 線程池的關閉 shutdownNow 方式

/**
 * Attempts to stop all actively executing tasks, halts the
 * processing of waiting tasks, and returns a list of the tasks
 * that were awaiting execution. These tasks are drained (removed)
 * from the task queue upon return from this method.
 *
 * <p>This method does not wait for actively executing tasks to
 * terminate.  Use {@link #awaitTermination awaitTermination} to
 * do that.
 *
 * <p>There are no guarantees beyond best-effort attempts to stop
 * processing actively executing tasks.  This implementation
 * cancels tasks via {@link Thread#interrupt}, so any task that
 * fails to respond to interrupts may never terminate.
 *
 * @throws SecurityException {@inheritDoc}
 */
public List<Runnable> shutdownNow() {
    List<Runnable> tasks;
    final ReentrantLock mainLock = this.mainLock;
    mainLock.lock();
    try {
        checkShutdownAccess();
        advanceRunState(STOP); // 1:把線程池設置為STOP
        interruptWorkers(); // 2.中斷工作線程
        tasks = drainQueue(); // 3.把線程池中的任務都 drain 出來
    } finally {
        mainLock.unlock();
    }
    tryTerminate();
    return tasks;
}

注釋的意思是:

嘗試停止所有正在執行的任務,暫停正在等待的任務的處理,并返回等待執行的任務列表。從該方法返回時,這些任務將從任務隊列中清空(移除)。

此方法不等待活動執行的任務終止。如果需要,可使用 awaitTermination() 做到這一點。

除了盡最大努力嘗試停止處理主動執行的任務之外,沒有其他保證。

此實現通過 Thread.Interrupt() 取消任務,因此任何無法響應中斷的任務都可能永遠不會終止。

4.1 第一步:advanceRunState() 把線程池設置為STOP

和 shutdown() 方法不同的是,shutdownNow() 方法會把線程池的狀態設置為 STOP。

4.2 第二步:interruptWorkers() 中斷工作線程

interruptWorkers() 如下,可以看到,和 shutdown() 方法不同的是,所有的工作線程都調用了 interrupt() 方法

/**
 * Interrupts all threads, even if active. Ignores SecurityExceptions
 * (in which case some threads may remain uninterrupted).
 */
private void interruptWorkers() {
    final ReentrantLock mainLock = this.mainLock;
    mainLock.lock();
    try {
        for (Worker w : workers)
            w.interruptIfStarted();
    } finally {
        mainLock.unlock();
    }
}

4.3 第三步:drainQueue() 把線程池中的任務都 drain 出來

drainQueue() 方法如下,把阻塞隊列里面等待的任務都拿出來,并返回。關閉線程池的時候,可以基于這個特性,把返回的任務都打印出來,做個記錄。

/**
 * Drains the task queue into a new list, normally using
 * drainTo. But if the queue is a DelayQueue or any other kind of
 * queue for which poll or drainTo may fail to remove some
 * elements, it deletes them one by one.
 */
private List<Runnable> drainQueue() {
    BlockingQueue<Runnable> q = workQueue;
    ArrayList<Runnable> taskList = new ArrayList<Runnable>();
    q.drainTo(taskList);
    if (!q.isEmpty()) {
        for (Runnable r : q.toArray(new Runnable[0])) {
            if (q.remove(r))
                taskList.add(r);
        }
    }
    return taskList;
}

4.4 總結

shutdownNow() 方法干三件事:

  1. 把線程池狀態置為 STOP 狀態
  2. 中斷工作線程
  3. 把線程池中的任務都 drain 出來并返回

我們來看個例子,代碼合剛才的一樣,只是關閉線程用的是shutdownNow()

public static void test01() throws InterruptedException {

    // corePoolSize 是 1,maximumPoolSize 是 1,無限容量
    ThreadPoolExecutor es = new ThreadPoolExecutor(1, 1,
            60L, TimeUnit.SECONDS,
            new LinkedBlockingQueue<>());
    es.prestartAllCoreThreads(); // 啟動所有 worker
    es.execute(new Task()); // Task是一個訪問某網站的 HTTP 請求,跑的慢,后面會貼出來完整代碼,這里把他當做一個跑的慢的異步任務就行
    es.execute(new Task());
    List<Runnable> result = es.shutdownNow();
    System.out.println(result);
    es.execute(new Task()); // 在線程池 shutdownNow() 后 繼續添加任務,這里預期是拋出異常
}

這個例子我們主要觀察三個現象。 一個是線程池有兩個woker,所以當調用shutdownNow() 方法,走進 interruptWorkers() 的時候,所有的 woker 都會調用 t.interrupt()

第二個是 shutdownNow() 方法會返回還沒來得及執行的task,并打印出來。

第三個是調用 shutdownNow() 方法后,再調用 execute() 時,會拋出異常,因為線程池的狀態已經置為 STOP,不再接受新的任務添加

5 實戰,與 JVM 鉤子配合

實際工作中,我們一般是使用 shutdown() 方法,因為它比較“溫和”,會等待我們把線程池中的任務都執行完,這里也已 shutdown() 方法為例。

我們回到最開頭聊到的那個 case,機器重新發布,但是線程池中還有沒執行完任務,機器一關,這些任務全部被kill,怎么辦呢?有什么機制能夠阻塞一下,等待這個任務執行完再關閉嗎?

有的,用 JVM 的鉤子!(深入了解 JVM 鉤子可以再看看這篇博文:掃盲 JVM 安全退出機制:shutdownHook,signalHandler[1]

實例代碼如下,一個線程池,提交了三個任務去執行,執行完得半分鐘。然后增加一個JVM的鉤子,這個鉤子可以簡單理解為監聽器,注冊后,JVM在關閉的時候就會調用這個方法,調用完才會正式關閉JVM。

public static void test01() throws InterruptedException {

    ThreadPoolExecutor es = new ThreadPoolExecutor(1, 1,
            60L, TimeUnit.SECONDS,
            new LinkedBlockingQueue<>());

    es.execute(new Task());
    es.execute(new Task());
    es.execute(new Task());


    Thread shutdownHook = new Thread(() -> {
        es.shutdown();
        try {
            es.awaitTermination(3, TimeUnit.MINUTES);
        } catch (InterruptedException e) {
            e.printStackTrace();
            System.out.println("等待超時,直接關閉");
        }
    });
    Runtime.getRuntime().addShutdownHook(shutdownHook);
}

在機器上執行,會發現,我使用 ctrl + c (注意不是ctrl + z )關閉進程,會發現進程并沒有直接關閉,線程池任然執行,一直等到線程池的任務執行完,進程才會正式退出。

怎么樣,是不是很神奇。

本文中涉及的 Task 的源碼如下。這個任務是對 stackoverflow 網站發起 10 次請求,用來模擬跑的比較慢的任務,當然這不是重點,可以忽略,有興趣動手試一下本文代碼的同學可以參考下。

public static class Task implements Runnable {

        @Override
        public void run() {
            System.out.println("task start");
            for (int i = 0; i < 10; i++) {
                httpGet();
                System.out.println("task execute " + i);
            }
            System.out.println("task finish");
        }

        private void httpGet() {

            String url = "https://stackoverflow.com/";
            String result = "";
            BufferedReader in = null;
            try {
                String urlName = url;
                URL realUrl = new URL(urlName);
                // 打開和URL之間的連接
                URLConnection conn = realUrl.openConnection();
                // 設置通用的請求屬性
                conn.setRequestProperty("accept", "*/*");
                conn.setRequestProperty("connection", "Keep-Alive");
                conn.setRequestProperty("user-agent",
                        "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)");
                // 建立實際的連接
                conn.connect();
                // 獲取所有響應頭字段
                Map<String, List<String>> map = conn.getHeaderFields();
//                 遍歷所有的響應頭字段
//                for (String key : map.keySet()) {
//                    System.out.println(key + "--->" + map.get(key));
//                }
                // 定義BufferedReader輸入流來讀取URL的響應
                in = new BufferedReader(
                        new InputStreamReader(conn.getInputStream()));
                String line;
                while ((line = in.readLine()) != null) {
                    result += "/n" + line;
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            // 使用finally塊來關閉輸入流
            finally {
                try {
                    if (in != null) {
                        in.close();
                    }
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
            }
//            System.out.print(result);
        }
    }

6 總結

想要優雅的關閉線程池,首先要理解線程中斷的含義。

其次,關閉線程池有兩種方式:shutdown()  shutdownNow(),二者最大的區別是 shutdown() 只是把空閑的 woker 置為中斷,不影響正在運行的woker,并且會繼續把待執行的任務給處理完。shutdonwNow() 則是把所有的 woker 都置為中斷,待執行的任務全部抽出并返回,日常工作中更多是使用 shutdown()

最后,單純的使用 shutdown() 也不靠譜,還得使用 awaitTermination() 和 JVM 的鉤子,才算優雅的關閉線程池。

責任編輯:張燕妮 來源: 互聯網架構小馬哥
相關推薦

2024-11-13 16:37:00

Java線程池

2022-09-15 08:41:16

數據異構分庫分表

2022-03-14 08:02:08

輕量級動態線程池

2025-06-30 07:10:00

JavaJVM線程

2021-10-12 09:24:02

Java線程池源碼

2025-02-05 14:28:19

2024-02-26 08:28:24

Java線程CPU

2024-10-09 15:58:02

2021-01-19 10:35:49

JVM場景函數

2024-11-25 13:49:00

2012-05-15 02:18:31

Java線程池

2017-12-19 10:03:44

JavaLinux代碼

2024-07-22 19:31:34

2022-04-11 08:17:07

JVMJava進程

2021-09-11 15:26:23

Java多線程線程池

2025-02-12 00:21:44

Java并發編程

2015-08-20 09:17:36

Java線程池

2025-08-01 09:01:00

2025-06-24 08:25:00

Java并發編程線程

2023-03-27 08:41:59

Java并發編程中斷線程
點贊
收藏

51CTO技術棧公眾號

久久影院午夜精品| 91精品国自产| 在线亚洲a色| 欧美日韩精品一区二区三区蜜桃 | 国产一区二区电影在线观看| 欧美色网一区二区| 久艹在线免费观看| 毛片免费在线播放| 国产一区免费电影| 国产999精品久久久| 免费毛片在线播放免费| 国产一区二区三区不卡视频网站| 91精品国产高清一区二区三区蜜臀| 蜜臀精品一区二区| 国产网友自拍视频导航网站在线观看 | 精品欧美一区二区精品少妇| 久久婷婷久久| 久久久久久久久综合| 女人黄色一级片| 精品少妇一区| 欧美一区二区三区免费大片| 成人羞羞国产免费网站| 激情网站在线| 中文字幕色av一区二区三区| 欧美日韩精品不卡| 蜜桃在线一区二区| 国产在线看一区| 国产精品久久久久久久久| 免费毛片一区二区三区| 亚洲v在线看| 色悠悠久久久久| 久久国产精品无码一级毛片| av成人app永久免费| 555夜色666亚洲国产免| 亚洲一区二区蜜桃| 天天综合网天天| 日韩欧美在线看| www一区二区www免费| 影音先锋男人在线资源| 亚洲欧洲精品一区二区三区不卡 | 国产精品一区二区三区四区色| 成人精品小蝌蚪| 99精品99久久久久久宅男| 怡红院男人的天堂| 麻豆成人久久精品二区三区红| 日本成人激情视频| 青草视频在线观看免费| 国产精品一区毛片| 26uuu亚洲国产精品| 日本va欧美va国产激情| 亚洲另类自拍| 欧美野外猛男的大粗鳮| 久久国产黄色片| 麻豆久久精品| 国产精品白丝jk喷水视频一区| 波多野结衣国产| 国产日韩欧美一区| 欧美在线视频a| 男人天堂2024| 日韩精品高清不卡| 国产拍精品一二三| 在线观看国产黄| 狠狠网亚洲精品| 99久久精品无码一区二区毛片| av小说天堂网| 丁香亚洲综合激情啪啪综合| 精品高清视频| 黑人与亚洲人色ⅹvideos | 亚洲国产一区在线| 嫩草香蕉在线91一二三区| 国产精品久久久久久久裸模| 亚州欧美一区三区三区在线| 免费av网站在线看| 亚洲综合激情另类小说区| 国产一线二线三线女| 激情黄产视频在线免费观看| 色8久久精品久久久久久蜜| 激情视频综合网| 国产日韩在线观看视频 | porn亚洲| 亚洲男人的天堂在线aⅴ视频| 992tv快乐视频| 99热99re6国产在线播放| 欧美视频免费在线| 奇米影音第四色| 五月亚洲婷婷| 亚洲日本成人女熟在线观看 | 欧美777四色影视在线| 欧美激情资源网| 超碰超碰超碰超碰超碰| 欧美xxx网站| 91精品国产欧美一区二区成人| 日批免费观看视频| 欧美一级精品| 欧美激情性做爰免费视频| 天天干天天干天天干天天| 久热成人在线视频| 国产综合精品一区二区三区| av大全在线免费看| 亚洲成人免费在线观看| 亚洲 欧美 日韩系列| 伊人久久影院| 在线观看久久久久久| 麻豆亚洲av熟女国产一区二| 人人精品人人爱| 国产综合 伊人色| 国产视频一区二区| 91电影在线观看| 秘密基地免费观看完整版中文 | 日韩欧美黄色大片| 视频精品二区| 日韩在线观看你懂的| 欧美成人片在线观看| 男女男精品视频网| 久久66热这里只有精品| av官网在线播放| 欧美午夜一区二区三区| 久久久精品人妻无码专区| 午夜久久美女| 91精品国产综合久久久久久久久 | 中文字幕欧美一| 无遮挡又爽又刺激的视频| 精品精品国产毛片在线看| 久久香蕉频线观| 中文字幕在线观看第二页| 91麻豆123| 国产美女在线一区| 日韩欧美另类中文字幕| 久久精品久久久久电影| 日韩乱码一区二区三区| 久久亚洲综合色一区二区三区 | 男男视频亚洲欧美| 日韩高清国产精品| 英国三级经典在线观看| 亚洲国产欧美一区二区三区同亚洲| 国产日韩欧美在线观看视频| 久久se这里有精品| 亚洲一区二区三区四区中文| 日本电影欧美片| 亚洲欧美中文日韩在线| 免费观看成人毛片| 91亚洲午夜精品久久久久久| 热99这里只有精品| 久久国产精品色av免费看| 久久久久久尹人网香蕉| 粉嫩小泬无遮挡久久久久久| 一区二区三区四区国产精品| 久久久男人的天堂| 亚洲天堂偷拍| 激情视频一区二区| 日韩脚交footjobhd| 日韩理论片久久| 国产女主播喷水视频在线观看| 久久一夜天堂av一区二区三区| 男女午夜激情视频| 怕怕欧美视频免费大全| 国产精品成人播放| 蜜桃视频在线观看免费视频网站www| 欧美巨大另类极品videosbest | 欧美一区二区三区在线看| 91人妻一区二区三区蜜臀| 国产精品白丝jk黑袜喷水| 黄色一级视频播放| 国产成人在线中文字幕| 91av在线影院| 9色在线观看| 欧美丰满少妇xxxxx高潮对白| 国产精品嫩草影院俄罗斯| 国产精品一区二区三区网站| 中国丰满熟妇xxxx性| 婷婷国产精品| 国产乱人伦真实精品视频| www在线观看播放免费视频日本| 日韩欧美国产不卡| 国产www在线| 国产精品久久免费看| 欧美一区二区三区影院| 在线一区免费观看| 一级做a爰片久久| 99精品国产高清一区二区麻豆| 2023亚洲男人天堂| 精品欧美色视频网站在线观看| 精品美女一区二区三区| 91视频在线视频| 亚洲人成小说网站色在线| 日本黄色片在线播放| 久久精品国产亚洲高清剧情介绍| 国产视频在线观看网站| 蜜乳av综合| 91原创国产| 亚洲精品国产嫩草在线观看| 欧美日本啪啪无遮挡网站| 欧美色图另类| 日韩欧美国产成人一区二区| www.久久久久久久| 亚洲精品国产视频| 精品国产成人亚洲午夜福利| 国产精品亚洲一区二区三区在线| 女人另类性混交zo| 黄色成人av网站| 中文字幕中文字幕99| 羞羞色国产精品网站| 92看片淫黄大片看国产片| 欧美××××黑人××性爽| 欧美高清在线播放| 日韩在线观看www| 日韩精品免费看| 国内老熟妇对白xxxxhd| 欧美在线观看一区二区| 国产 日韩 欧美 在线| 亚洲精品视频一区| 欧美激情久久久久久久| 91麻豆福利精品推荐| 黑人玩弄人妻一区二区三区| 久久精品国产秦先生| 丰满人妻中伦妇伦精品app| 欧美99久久| 中文字幕久精品免| jlzzjlzz亚洲女人| 国产精品免费区二区三区观看| 涩涩涩久久久成人精品| 国产精品99导航| 欧美裸体视频| 久久露脸国产精品| 性网站在线观看| 久久精品国产亚洲| jizz在线免费观看| 亚洲欧美制服另类日韩| 午夜黄色小视频| 亚洲精品在线免费播放| 99热这里只有精品66| 在线电影一区二区三区| 中文字幕网址在线| 在线日韩av片| 无码人妻精品一区二区50| 精品久久久一区二区| 日本熟伦人妇xxxx| 香蕉成人伊视频在线观看| 国内偷拍精品视频| 亚洲黄色免费电影| 日韩欧美国产成人精品免费| 亚洲人精品午夜| a级片在线观看免费| 亚洲免费观看视频| www.av视频| 一区二区三区中文字幕精品精品| 一区二区三区四区五区| 一区二区国产盗摄色噜噜| 久久久久久久久久网站| 樱花草国产18久久久久| 国产亚洲第一页| 午夜精品福利在线| 国产精品777777| 在线一区二区观看| 亚洲无码久久久久久久| 91精品婷婷国产综合久久竹菊| 国产又粗又猛又色又| 日韩视频一区二区三区在线播放| 国产成人精品无码高潮| 精品国产乱码久久| 九九在线视频| 日韩在线观看免费| 日韩另类在线| 91成人天堂久久成人| 日韩国产网站| 91超碰在线电影| 日本成人7777| 日韩精品不卡| 一区二区三区网站 | 日韩电影免费在线| 日韩精品视频一二三| 国产乱人伦偷精品视频不卡 | a天堂在线视频| 精品福利在线导航| 国产视频精品久久| 不卡av日日日| 性孕妇free特大另类| 国产精品视频网站| 中文字幕久久精品一区二区| 久久青青草原一区二区| 日韩中文首页| 国产一二三在线视频| 丝袜美腿一区二区三区| 1314成人网| 久久精品一区二区三区av| 亚洲国产123| 图片区小说区国产精品视频| 中文亚洲av片在线观看| 日韩精品一区二区在线观看| 你懂的在线看| 欧美成人性色生活仑片| 吞精囗交69激情欧美| 97超碰资源| 日韩av在线中文字幕| 草草视频在线免费观看| 久久国产尿小便嘘嘘| 六十路息与子猛烈交尾| 亚洲欧美在线aaa| av大全在线观看| 欧美mv日韩mv亚洲| 五月婷婷在线视频| 51精品国产黑色丝袜高跟鞋 | 日本在线不卡视频| 在线免费看黄色片| 亚洲视频一区在线观看| 国产伦精品一区二区三区视频我 | 国产在线超碰| 欧美激情欧美激情| 成人午夜毛片| 欧美黑人xxxxx| 国产精品www.| aaa一级黄色片| 欧美国产亚洲另类动漫| 天天操天天干视频| 精品国产电影一区二区| 黄色一级大片在线免费看产| 国产精品精品国产| 网友自拍区视频精品| 日韩在线观看a| 国产真实乱偷精品视频免| 四季av中文字幕| 91福利在线播放| 男女污污视频在线观看| 亚州欧美日韩中文视频| 亚洲伦理久久| 亚洲一区尤物| 蜜桃av一区二区三区电影| 免费看黄色的视频| 色综合一区二区三区| 香蕉视频911| 亚州欧美日韩中文视频| 国产丝袜一区| 男女超爽视频免费播放| 成人深夜福利app| 国产一级一片免费播放| 精品国产一区二区在线观看| 污污在线观看| 91在线精品观看| 欧美日韩亚洲一区三区| 26uuu国产| 亚洲午夜久久久| 人妻91麻豆一区二区三区| 欧美激情18p| 国产精品xxxav免费视频| 久久国产精品视频在线观看| av一二三不卡影片| 国产99久久久| 一本色道久久综合亚洲精品小说| 精品日韩视频| 资源网第一页久久久| 黑人巨大精品欧美黑白配亚洲| 懂色av蜜臀av粉嫩av永久| 91精品国产色综合久久| 婷婷色在线播放| 精品久久久久久一区| 国产模特精品视频久久久久| 一区二区三区四区免费| 欧美日韩国产一二三| 很黄的网站在线观看| 99在线热播| 亚洲综合精品| 欧美日韩中文字幕视频| 欧美电影影音先锋| 日本在线观看大片免费视频| 国产精品一区二区免费看| 久久av最新网址| 日本不卡一区视频| 日韩欧美资源站| 免费h视频在线观看| 日韩电影在线播放| 国产一区二区三区不卡在线观看 | 欧美一区二区三区婷婷月色| 日本中文字幕中出在线| 九色91在线视频| 免播放器亚洲一区| 久久亚洲av午夜福利精品一区| 日韩av在线免费观看| 日本在线一区二区| 野外做受又硬又粗又大视频√| 国产亚洲精品超碰| 国产又粗又猛又黄| 伦理中文字幕亚洲| 亚洲精品进入| 天天操精品视频| 福利视频第一区| 黄色网址在线免费观看| 久久大片网站| 国产美女视频91| 国产午夜精品久久久久| 久久影院在线观看| 日韩欧美国产大片| 久久6免费视频| 在线日韩一区二区| 97超碰免费在线| 一区二区免费电影| 91麻豆123| 亚洲精品成人区在线观看| 国产精品伦子伦免费视频| 在线不卡欧美| 久久中文免费视频|