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

寫給小白看的線程池,學會了嗎?

開發 后端
線程池(Thread Pool):把一個或多個線程通過統一的方式進行調度和重復使用的技術,避免了因為線程過多而帶來使用上的開銷。

[[378941]]

為什么要用線程池呢?

下面是一段創建線程并運行的代碼:

  1. for (int i = 0; i < 100; i++) { 
  2.     new Thread(() -> { 
  3.         System.out.println("run thread->" + Thread.currentThread().getName()); 
  4.         userService.updateUser(....); 
  5.     }).start(); 

我們想使用這種方式去做異步,或者提高性能,然后將某些耗時操作放入一個新線程去運行。

這種思路是沒問題的,但是這段代碼是存在問題的,有哪些問題呢?下面我們就來看看有哪些問題;

  • 創建銷毀線程資源消耗;我們使用線程的目的本是出于效率考慮,可以為了創建這些線程卻消耗了額外的時間,資源,對于線程的銷毀同樣需要系統資源。
  • cpu資源有限,上述代碼創建線程過多,造成有的任務不能即時完成,響應時間過長。
  • 線程無法管理,無節制地創建線程對于有限的資源來說似乎成了“得不償失”的一種作用。

既然我們上面使用手動創建線程會存在問題,那有解決方法嗎?

答案:有的,使用線程池。

線程池介紹

線程池(Thread Pool):把一個或多個線程通過統一的方式進行調度和重復使用的技術,避免了因為線程過多而帶來使用上的開銷。

線程池有什么優點?

  • 降低資源消耗。通過重復利用已創建的線程降低線程創建和銷毀造成的消耗。
  • 提高響應速度。當任務到達時,任務可以不需要等到線程創建就能立即執行。
  • 提高線程的可管理性。

線程池使用

在JDK中rt.jar包下JUC(java.util.concurrent)創建線程池有兩種方式:ThreadPoolExecutor 和 Executors,其中 Executors又可以創建 6 種不同的線程池類型。

ThreadPoolExecutor 的使用

線程池使用代碼如下:

  1. import java.util.concurrent.LinkedBlockingQueue; 
  2. import java.util.concurrent.ThreadPoolExecutor; 
  3. import java.util.concurrent.TimeUnit; 
  4.  
  5. public class ThreadPoolDemo { 
  6.     private static ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(2, 10, 10L, TimeUnit.SECONDS, new LinkedBlockingQueue(100)); 
  7.  
  8.     public static void main(String[] args) { 
  9.         threadPoolExecutor.execute(new Runnable() { 
  10.             @Override 
  11.             public void run() { 
  12.                 System.out.println("田先生您好"); 
  13.             } 
  14.         }); 
  15.     } 

以上程序執行結果如下:

田先生您好

核心參數說明

ThreadPoolExecutor的構造方法有以下四個:

可以看到最后那個構造方法有 7 個構造參數,其實前面的三個構造方法只是對最后那個方法進行包裝,并且前面三個構造方法最終都是調用最后那個構造方法,所以我們這里就來聊聊最后那個構造方法。

參數解釋

corePoolSize

線程池中的核心線程數,默認情況下核心線程一直存活在線程池中,如果將 ThreadPoolExecutor 的 allowCoreThreadTimeOut 屬性設為 true,如果線程池一直閑置并超過了 keepAliveTime 所指定的時間,核心線程就會被終止。

maximumPoolSize

最大線程數,當線程不夠時能夠創建的最大線程數。

keepAliveTime

線程池的閑置超時時間,默認情況下對非核心線程生效,如果閑置時間超過這個時間,非核心線程就會被回收。如果 ThreadPoolExecutor 的 allowCoreThreadTimeOut 設為 true 的時候,核心線程如果超過閑置時長也會被回收。

unit

配合 keepAliveTime 使用,用來標識 keepAliveTime 的時間單位。

workQueue

線程池中的任務隊列,使用 execute() 或 submit() 方法提交的任務都會存儲在此隊列中。

threadFactory

為線程池提供創建新線程的線程工廠。

rejectedExecutionHandler

線程池任務隊列超過最大值之后的拒絕策略,RejectedExecutionHandler 是一個接口,里面只有一個 rejectedExecution 方法,可在此方法內添加任務超出最大值的事件處理。ThreadPoolExecutor 也提供了 4 種默認的拒絕策略:

  • DiscardPolicy():丟棄掉該任務,不進行處理。
  • DiscardOldestPolicy():丟棄隊列里最近的一個任務,并執行當前任務。
  • AbortPolicy():直接拋出 RejectedExecutionException 異常(默認)。
  • CallerRunsPolicy():既不拋棄任務也不拋出異常,直接使用主線程來執行此任務。

包含所有參數的使用案例:

  1. public class ThreadPoolExecutorTest { 
  2.     public static void main(String[] args) throws InterruptedException, ExecutionException { 
  3.         ThreadPoolExecutor threadPool = new ThreadPoolExecutor(1, 1, 
  4.                 10L, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>(2), 
  5.                 new MyThreadFactory(), new ThreadPoolExecutor.CallerRunsPolicy()); 
  6.         threadPool.allowCoreThreadTimeOut(true); 
  7.         for (int i = 0; i < 10; i++) { 
  8.             threadPool.execute(new Runnable() { 
  9.                 @Override 
  10.                 public void run() { 
  11.                     System.out.println(Thread.currentThread().getName()); 
  12.                     try { 
  13.                         Thread.sleep(2000); 
  14.                     } catch (InterruptedException e) { 
  15.                         e.printStackTrace(); 
  16.                     } 
  17.                 } 
  18.             }); 
  19.         } 
  20.     } 
  21. class MyThreadFactory implements ThreadFactory { 
  22.     private AtomicInteger count = new AtomicInteger(0); 
  23.     @Override 
  24.     public Thread newThread(Runnable r) { 
  25.         Thread t = new Thread(r); 
  26.         String threadName = "MyThread" + count.addAndGet(1); 
  27.         t.setName(threadName); 
  28.         return t; 
  29.     } 

運行輸出:

  1. main 
  2. MyThread1 
  3. main 
  4. MyThread1 
  5. MyThread1 
  6. .... 

這里僅僅是為了演示所有參數自定義,并沒有其他用途。

execute() 和 submit()的使用

execute() 和 submit() 都是用來執行線程池的,區別在于 submit() 方法可以接收線程池執行的返回值。

下面分別來看兩個方法的具體使用和區別:

  1. // 創建線程池 
  2. ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(2, 10, 10L, TimeUnit.SECONDS, new LinkedBlockingQueue(100)); 
  3. // execute 使用 
  4. threadPoolExecutor.execute(new Runnable() { 
  5.     @Override 
  6.     public void run() { 
  7.         System.out.println("老田您好"); 
  8.     } 
  9. }); 
  10. // submit 使用 
  11. Future<String> future = threadPoolExecutor.submit(new Callable<String>() { 
  12.     @Override 
  13.     public String call() throws Exception { 
  14.         System.out.println("田先生您好"); 
  15.         return "返回值"
  16.     } 
  17. }); 
  18. System.out.println(future.get()); 

以上程序執行結果如下:

  1. 老田您好 
  2. 田先生您好 
  3. 返回值 

Executors

Executors 執行器創建線程池很多基本上都是在 ThreadPoolExecutor 構造方法上進行簡單的封裝,特殊場景根據需要自行創建。可以把Executors理解成一個工廠類 。Executors可以創建 6 種不同的線程池類型。

下面對這六個方法進行簡要的說明:

newFixedThreadPool

創建一個數量固定的線程池,超出的任務會在隊列中等待空閑的線程,可用于控制程序的最大并發數。

newCacheThreadPool

短時間內處理大量工作的線程池,會根據任務數量產生對應的線程,并試圖緩存線程以便重復使用,如果限制 60 秒沒被使用,則會被移除緩存。如果現有線程沒有可用的,則創建一個新線程并添加到池中,如果有被使用完但是還沒銷毀的線程,就復用該線程。終止并從緩存中移除那些已有 60 秒鐘未被使用的線程。因此,長時間保持空閑的線程池不會使用任何資源。

newScheduledThreadPool

創建一個數量固定的線程池,支持執行定時性或周期性任務。

newWorkStealingPool

Java 8 新增創建線程池的方法,創建時如果不設置任何參數,則以當前機器CPU 處理器數作為線程個數,此線程池會并行處理任務,不能保證執行順序。

newSingleThreadExecutor

創建一個單線程的線程池。這個線程池只有一個線程在工作,也就是相當于單線程串行執行所有任務。如果這個唯一的線程因為異常結束,那么會有一個新的線程來替代它。此線程池保證所有任務的執行順序按照任務的提交順序執行。

newSingleThreadScheduledExecutor

此線程池就是單線程的 newScheduledThreadPool。

線程池如何關閉?

線程池關閉,可以使用 shutdown() 或 shutdownNow() 方法,它們的區別是:

  • shutdown():不會立即終止線程池,而是要等所有任務隊列中的任務都執行完后才會終止。執行完 shutdown 方法之后,線程池就不會再接受新任務了。
  • shutdownNow():執行該方法,線程池的狀態立刻變成 STOP 狀態,并試圖停止所有正在執行的線程,不再處理還在池隊列中等待的任務,執行此方法會返回未執行的任務。

下面用代碼來模擬 shutdown() 之后,給線程池添加任務,代碼如下:

  1. import java.util.concurrent.*; 
  2. import java.util.concurrent.atomic.AtomicInteger; 
  3.  
  4. public class ThreadPoolExecutorAllArgsTest { 
  5.    public static void main(String[] args) throws InterruptedException, ExecutionException { 
  6.        //創建線程池 
  7.        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 1, 
  8.                10L, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>(2), 
  9.                new MyThreadFactory(), new ThreadPoolExecutor.CallerRunsPolicy()); 
  10.        threadPoolExecutor.allowCoreThreadTimeOut(true); 
  11.        //提交任務 
  12.        threadPoolExecutor.execute(() -> { 
  13.            for (int i = 0; i < 3; i++) { 
  14.                System.out.println("提交任務" + i); 
  15.                try { 
  16.                    Thread.sleep(3000); 
  17.                } catch (InterruptedException e) { 
  18.                    System.out.println(e.getMessage()); 
  19.                } 
  20.            } 
  21.        }); 
  22.        threadPoolExecutor.shutdown(); 
  23.        //再次提及任務 
  24.        threadPoolExecutor.execute(() -> { 
  25.            System.out.println("我想再次提及任務"); 
  26.        }); 
  27.    } 

以上程序執行結果如下:

  1. 提交任務0 
  2. 提交任務1 
  3. 提交任務2 

可以看出,shutdown() 之后就不會再接受新的任務了,不過之前的任務會被執行完成。

面試題

面試題1:ThreadPoolExecutor 有哪些常用的方法?

  • ThreadPoolExecutor有如下常用方法:
  • submit()/execute():執行線程池
  • shutdown()/shutdownNow():終止線程池
  • isShutdown():判斷線程是否終止
  • getActiveCount():正在運行的線程數
  • getCorePoolSize():獲取核心線程數
  • getMaximumPoolSize():獲取最大線程數
  • getQueue():獲取線程池中的任務隊列
  • allowCoreThreadTimeOut(boolean):設置空閑時是否回收核心線程

這些方法可以用來終止線程池、線程池監控等。

面試題2:說說submit(和 execute兩個方法有什么區別?

submit() 和 execute() 都是用來執行線程池的,只不過使用 execute() 執行線程池不能有返回方法,而使用 submit() 可以使用 Future 接收線程池執行的返回值。

說說線程池創建需要的那幾個核心參數的含義

ThreadPoolExecutor 最多包含以下七個參數:

  • corePoolSize:線程池中的核心線程數
  • maximumPoolSize:線程池中最大線程數
  • keepAliveTime:閑置超時時間
  • unit:keepAliveTime 超時時間的單位(時/分/秒等)
  • workQueue:線程池中的任務隊列
  • threadFactory:為線程池提供創建新線程的線程工廠
  • rejectedExecutionHandler:線程池任務隊列超過最大值之后的拒絕策略

面試題3:shutdownNow() 和 shutdown() 兩個方法有什么區別?

shutdownNow() 和 shutdown() 都是用來終止線程池的,它們的區別是,使用 shutdown() 程序不會報錯,也不會立即終止線程,它會等待線程池中的緩存任務執行完之后再退出,執行了 shutdown() 之后就不能給線程池添加新任務了;shutdownNow() 會試圖立馬停止任務,如果線程池中還有緩存任務正在執行,則會拋出 java.lang.InterruptedException: sleep interrupted 異常。

面試題6:了解過線程池的工作原理嗎?

當線程池中有任務需要執行時,線程池會判斷如果線程數量沒有超過核心數量就會新建線程池進行任務執行,如果線程池中的線程數量已經超過核心線程數,這時候任務就會被放入任務隊列中排隊等待執行;如果任務隊列超過最大隊列數,并且線程池沒有達到最大線程數,就會新建線程來執行任務;如果超過了最大線程數,就會執行拒絕執行策略。

面試題5:線程池中核心線程數量大小怎么設置?

「CPU密集型任務」:比如像加解密,壓縮、計算等一系列需要大量耗費 CPU 資源的任務,大部分場景下都是純 CPU 計算。盡量使用較小的線程池,一般為CPU核心數+1。因為CPU密集型任務使得CPU使用率很高,若開過多的線程數,會造成CPU過度切換。

「IO密集型任務」:比如像 MySQL 數據庫、文件的讀寫、網絡通信等任務,這類任務不會特別消耗 CPU 資源,但是 IO 操作比較耗時,會占用比較多時間??梢允褂蒙源蟮木€程池,一般為2*CPU核心數。IO密集型任務CPU使用率并不高,因此可以讓CPU在等待IO的時候有其他線程去處理別的任務,充分利用CPU時間。

另外:線程的平均工作時間所占比例越高,就需要越少的線程;線程的平均等待時間所占比例越高,就需要越多的線程;

以上只是理論值,實際項目中建議在本地或者測試環境進行多次調優,找到相對理想的值大小。

面試題7:線程池為什么需要使用(阻塞)隊列?

主要有三點:

  • 因為線程若是無限制的創建,可能會導致內存占用過多而產生OOM,并且會造成cpu過度切換。
  • 創建線程池的消耗較高。

面試題8:線程池為什么要使用阻塞隊列而不使用非阻塞隊列?

阻塞隊列可以保證任務隊列中沒有任務時阻塞獲取任務的線程,使得線程進入wait狀態,釋放cpu資源。

當隊列中有任務時才喚醒對應線程從隊列中取出消息進行執行。

使得在線程不至于一直占用cpu資源。

(線程執行完任務后通過循環再次從任務隊列中取出任務進行執行,代碼片段如下

  1. while (task != null || (task = getTask()) != null) {})。 

不用阻塞隊列也是可以的,不過實現起來比較麻煩而已,有好用的為啥不用呢?

面試題9:了解線程池狀態嗎?

通過獲取線程池狀態,可以判斷線程池是否是運行狀態、可否添加新的任務以及優雅地關閉線程池等。

RUNNING:線程池的初始化狀態,可以添加待執行的任務。

SHUTDOWN:線程池處于待關閉狀態,不接收新任務僅處理已經接收的任務。

STOP:線程池立即關閉,不接收新的任務,放棄緩存隊列中的任務并且中斷正在處理的任務。

TIDYING:線程池自主整理狀態,調用 terminated() 方法進行線程池整理。

TERMINATED:線程池終止狀態。

面試題10:知道線程池中線程復用原理嗎?

線程池將線程和任務進行解耦,線程是線程,任務是任務,擺脫了之前通過 Thread 創建線程時的一個線程必須對應一個任務的限制。

在線程池中,同一個線程可以從阻塞隊列中不斷獲取新任務來執行,其核心原理在于線程池對 Thread 進行了封裝,并不是每次執行任務都會調用 Thread.start() 來創建新線程,而是讓每個線程去執行一個“循環任務”,在這個“循環任務”中不停的檢查是否有任務需要被執行,如果有則直接執行,也就是調用任務中的 run 方法,將 run 方法當成一個普通的方法執行,通過這種方式將只使用固定的線程就將所有任務的 run 方法串聯起來。

總結

本文通過沒有使用線程池帶來的弊端,Executors介紹,Executors的六種方法介紹、如何使用線程池,了解線程池原理,核心參數,以及10到線程池面試題。

本文轉載自微信公眾號「Java后端技術全?!梗梢酝ㄟ^以下二維碼關注。轉載本文請聯系Java后端技術全棧公眾號。

 

責任編輯:武曉燕 來源: Java后端技術全棧
相關推薦

2021-06-25 07:37:33

遞歸函數算法

2020-08-11 11:40:31

線程進程Linux

2023-10-30 11:40:36

OOM線程池單線程

2023-05-04 10:08:00

Windows 10WinAFL二進制

2023-01-28 09:50:17

java多線程代碼

2023-12-11 08:03:01

Java線程線程組

2022-08-08 10:45:49

PromiseJava腳手架

2022-07-08 09:27:48

CSSIFC模型

2024-02-02 11:03:11

React數據Ref

2024-01-19 08:25:38

死鎖Java通信

2023-07-26 13:11:21

ChatGPT平臺工具

2024-02-04 00:00:00

Effect數據組件

2023-01-10 08:43:15

定義DDD架構

2021-10-04 09:29:41

對象池線程池

2023-08-01 12:51:18

WebGPT機器學習模型

2024-01-02 12:05:26

Java并發編程

2025-01-27 00:00:00

線程安全Java

2024-05-29 07:47:30

SpringJava@Resource

2022-12-06 08:37:43

2023-01-30 09:01:54

圖表指南圖形化
點贊
收藏

51CTO技術棧公眾號

亚洲欧洲韩国日本视频| 日本美女一区二区三区视频| 精品日韩欧美在线| 久久久999视频| 成人精品一区二区| 国产一区二区久久| 午夜精品一区二区三区av| 可以直接看的无码av| 成人av集中营| 亚洲国产精品一区二区久久| 久久精品国产美女| 91精品人妻一区二区三区果冻| 在线高清一区| 日韩中文字幕不卡视频| 久久久久亚洲无码| 亚洲我射av| 狠狠色噜噜狠狠狠狠97| 在线观看免费黄色片| 日本国产在线| 东方aⅴ免费观看久久av| 国产精品嫩草视频| 三级黄色在线视频| 亚洲精品一区二区在线看| 日韩精品极品视频| 男人的天堂免费| 色综合一区二区日本韩国亚洲| 欧美日韩国产色视频| 日本一区二区三区四区五区六区| 欧美日韩在线中文字幕| 懂色av一区二区夜夜嗨| 国产日韩欧美日韩大片| 影音先锋亚洲天堂| 亚洲视屏一区| 久久五月情影视| 亚洲色图 激情小说| 色狼人综合干| 亚洲高清在线观看| 欧美污在线观看| 麻豆久久久久| 91黄视频在线| 97av视频在线观看| а√天堂中文资源在线bt| 一区二区三区色| 大地资源网在线观看免费官网| av播放在线| 国产视频一区二区在线| 久久久综合香蕉尹人综合网| 深爱五月激情五月| 成人av在线播放网站| 粉嫩精品一区二区三区在线观看 | 日韩电影在线观看完整版| 国产精品一区二区三区四区| 亚洲一区二区三区香蕉| 国产精品九九九九| 久久99精品久久久久久久久久久久| 国产精品高潮呻吟视频| 91麻豆精品在线| 日本视频在线一区| 国产精品专区第二| 中文字幕人妻一区二区在线视频| 日韩电影一二三区| 国产精品私拍pans大尺度在线| 精品国产www| 另类调教123区| 91中文在线视频| 国内精品久久久久久久久久久| 国内精品伊人久久久久av一坑| 91精品中国老女人| 亚洲产国偷v产偷v自拍涩爱| 粉嫩在线一区二区三区视频| 国产九色精品| 青青草免费在线| 国产精品色哟哟网站| 国产高清免费在线| 视频在线这里都是精品| 五月婷婷另类国产| 2022亚洲天堂| 国产福利亚洲| 日韩欧美黄色影院| 30一40一50老女人毛片| 精品免费一区二区| 久久夜精品va视频免费观看| 精品一级少妇久久久久久久| 亚洲一区不卡| 国产精品三级久久久久久电影| 国产又爽又黄免费软件| 成人美女在线视频| 日韩久久精品一区二区三区| 国产原厂视频在线观看| 午夜久久久影院| 手机视频在线观看| 91成人在线精品视频| 日韩精品视频免费在线观看| 九一在线免费观看| 国模大胆一区二区三区| 日韩美女在线播放| 国产视频一二三四区| 26uuu国产在线精品一区二区| 日韩电影天堂视频一区二区| 少妇av在线| 在线精品观看国产| 人妻激情偷乱频一区二区三区 | 国产最新精品精品你懂的| 99三级在线| 狠狠色伊人亚洲综合网站l| 国产精品短视频| 一区二区传媒有限公司| 精品自拍视频| 日韩电影网在线| 视频国产一区二区| 亚洲在线一区| 亚洲va欧美va国产综合剧情| 日韩欧美国产成人一区二区| 国产伦理片在线观看| 激情婷婷亚洲| 国产在线精品一区免费香蕉 | 黄色片网站在线免费观看| 狠狠色狠狠色综合系列| 麻豆久久久av免费| 国产精品一区hongkong| 欧美日韩亚洲不卡| a天堂中文字幕| 亚洲国产片色| 91久久精品国产91久久性色tv| 岛国大片在线观看| 精品国产精品自拍| 国产精久久久久| 亚洲人metart人体| 国产精品日韩专区| 巨骚激情综合| 丰满岳妇乱一区二区三区| 日韩av成人网| 欧美激情1区2区| 国产在线日韩在线| yourporn在线观看视频| 欧美性猛交xxxx黑人| 91精品又粗又猛又爽| 伊人久久大香线蕉综合四虎小说| 国产欧美在线播放| 日本电影全部在线观看网站视频| 在线看国产一区| 超碰97人人干| 久久99伊人| 美国av一区二区三区| 蜜桃麻豆av在线| 亚洲精品久久久久久久久| 五月天婷婷综合网| av影院午夜一区| koreanbj精品视频一区| 欧美电影在线观看完整版| 91精品国产91久久久| 天堂网2014av| 色综合一区二区三区| 色婷婷在线影院| 日日摸夜夜添夜夜添国产精品| 免费试看一区| 欧美日韩精品一区二区三区视频| 亚洲视频自拍偷拍| 亚洲永久精品视频| 亚洲视频免费观看| 手机在线播放av| 在线成人h网| 久久福利电影| 成人开心激情| 久久精品国产91精品亚洲| 国产日韩精品suv| 亚洲资源中文字幕| 国产老熟女伦老熟妇露脸| 久久成人在线| 亚洲欧美电影在线观看| 免费欧美网站| 91精品国产高清| 国产h在线观看| 7777精品伊人久久久大香线蕉最新版| 91麻豆免费视频网站| 成人免费视频视频在线观看免费| 久久亚洲中文字幕无码| 经典一区二区| 91在线观看免费高清完整版在线观看| 牛牛在线精品视频| 亚洲免费高清视频| 亚洲一区二区激情| 亚洲成人免费在线| av黄色在线免费观看| 激情久久五月天| 黄色成人在线看| 成人影院天天5g天天爽无毒影院| 亚洲aaaaaa| 天堂av中文在线观看| 中文字幕日韩欧美在线| 国产香蕉在线观看| 日本国产一区二区| 日韩黄色免费观看| 26uuu精品一区二区| 善良的小姨在线| 久久激情视频| 欧美在线观看视频免费| 蜜桃tv一区二区三区| 91在线国产电影| 欧美xoxoxo| 久久久久久国产| 日本在线www| 亚洲精品国产品国语在线| 国产又爽又黄又嫩又猛又粗| 粉嫩老牛aⅴ一区二区三区| 国产极品国产极品| 国产欧美日韩麻豆91| 折磨小男生性器羞耻的故事| 美女一区二区视频| 夫妻免费无码v看片| 欧美深夜福利| 亚洲视频sss| 国产99亚洲| 福利视频一区二区三区| 成人免费毛片嘿嘿连载视频…| 久久免费国产视频| 制服丝袜中文字幕在线| 这里只有精品在线观看| 欧美精品a∨在线观看不卡| 欧美r级电影在线观看| 国产一区二区三区成人| 色婷婷av久久久久久久| 国产 欧美 日韩 在线| 亚洲男人的天堂一区二区| 色综合99久久久无码国产精品| 成人av网站免费| 色悠悠在线视频| 国产乱人伦偷精品视频不卡| 国产又黄又猛的视频| 美女精品在线| 国产免费观看高清视频| 在线成人国产| 美女扒开大腿让男人桶| 91精品国产麻豆国产在线观看| 视频一区视频二区视频三区高| 亚洲品质自拍| 久久一区免费| 青青视频一区二区| 国产一区二区三区av在线| 99精品中文字幕在线不卡 | 欧美日本高清一区| а√天堂8资源在线官网| 日韩中文字幕在线视频| melody高清在线观看| 亚洲午夜av电影| 国产系列在线观看| 亚洲视频在线免费观看| 国家队第一季免费高清在线观看| 日韩禁在线播放| 毛片网站在线| 在线a欧美视频| 91高清在线| 日韩中文在线视频| 超碰在线免费公开| 久久99国产精品久久久久久久久| 91高清在线观看视频| 欧美黑人性视频| av福利导福航大全在线| 91精品国产91久久久久福利| 黄色软件视频在线观看| 国产97在线播放| 国产精品美女午夜爽爽| 成人国产精品av| 免费观看亚洲视频大全| 丁香婷婷久久久综合精品国产| 亚洲一区二区三区四区电影| 国产日韩欧美亚洲一区| 羞羞答答一区二区| 色一情一乱一伦一区二区三区丨| 久久美女视频| 香港三级日本三级a视频| 99热这里只有精品8| 黄色高清无遮挡| 久久se精品一区二区| 伊人久久久久久久久| 99久久综合狠狠综合久久| 蜜乳av中文字幕| 亚洲欧美另类久久久精品| 日韩经典在线观看| 欧美亚洲一区二区在线观看| a天堂中文在线观看| 日韩av在线免费播放| 成人在线二区| 欧美激情一区二区三区高清视频 | 欧美日韩一区二区三区四区五区六区| 99热这里都是精品| 日本二区三区视频| 午夜国产精品一区| 在线免费观看日韩视频| 欧美不卡在线视频| 国产精品一二三区视频| 欧美精品亚州精品| 成人直播视频| 亚洲综合一区二区不卡| 你微笑时很美电视剧整集高清不卡| 在线一区亚洲| 国产欧美精品久久| 九九热免费在线观看| 99精品久久99久久久久| 影音先锋男人看片资源| 婷婷久久综合九色综合绿巨人| 最近中文字幕免费观看| 亚洲激情视频在线| av免费在线网站| 国产精品免费久久久久久| 风间由美性色一区二区三区四区 | 麻豆传媒在线免费| 欧洲一区二区视频| 99a精品视频在线观看| 在线免费一区| 久久亚洲电影| 一本加勒比波多野结衣| 中文字幕一区二区视频| 亚洲欧美一二三区| 亚洲精品一区二区三区蜜桃下载| 生活片a∨在线观看| 国产成人精品日本亚洲| 久久久久97| 黄色一级片国产| 精品亚洲成av人在线观看| 中国女人特级毛片| 黄网动漫久久久| 亚洲乱色熟女一区二区三区| 色噜噜国产精品视频一区二区| 欧美18av| 久久久久久久久久码影片| 欧美特黄一级| 性鲍视频在线观看| 亚洲四区在线观看| 96日本xxxxxⅹxxx17| 国产亚洲欧美aaaa| 亚洲性受xxx喷奶水| 精品婷婷色一区二区三区蜜桃| 欧美aa国产视频| 深爱五月综合网| 亚洲视频图片小说| 国产女人18毛片18精品| 深夜精品寂寞黄网站在线观看| 亚洲黄色免费av| 欧美二级三级| 男女av一区三区二区色多| 中文字幕在线播放一区| 午夜久久久久久| 天堂中文在线官网| 午夜精品三级视频福利| 欧美性生活一级片| 天天摸天天碰天天添| 久久久综合网站| 无码人妻一区二区三区线| 精品亚洲永久免费精品| 欧美大片1688| 四虎影院一区二区三区 | 一本久久a久久精品亚洲| 日韩一卡二卡在线| 97在线免费观看| 亚洲国产合集| 992kp快乐看片永久免费网址| 日本一区二区成人| 91精品国自产| 欧美国产日产韩国视频| 久久综合社区| 国模吧无码一区二区三区 | 欧美日韩大片一区二区三区| 视频一区二区国产| 乱老熟女一区二区三区| 欧美一级国产精品| 激情在线视频播放| 久久久综合香蕉尹人综合网| 热久久久久久久| 天堂网avav| 亚洲国产高清高潮精品美女| 自拍偷拍亚洲视频| 在线观看国产一区| 国产白丝网站精品污在线入口| 亚洲视频免费播放| 国产亚洲视频在线| 看亚洲a级一级毛片| 精品欧美一区免费观看α√| 国产日韩欧美a| hs视频在线观看| 青青草原成人在线视频| 888久久久| 无码人妻aⅴ一区二区三区| 色94色欧美sute亚洲线路一ni| 快射av在线播放一区| 国产日韩精品久久| 久久精品国产一区二区| 国产性生活网站| 国产一区二区久久精品| 国产欧美88| 男人透女人免费视频| 亚洲免费观看在线观看| 欧美在线一卡| 亚洲最大成人在线| 老司机精品久久| 久久国产精品波多野结衣| 亚洲免费精彩视频| 99这里只有精品视频| jizz大全欧美jizzcom| 亚洲成人av中文|