亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

Java從零開始學四十四(多線程)

2019-11-14 23:52:18
字體:
來源:轉載
供稿:網友
java從零開始學四十四(多線程)一、進程與線程1.1、進程

進程是應用程序的執行實例。

進程是程序的一次動態執行過程,它經歷了從代碼加載、執行到執行完畢的一個完整過程,這個過程也是進程本身從產生、發展到最終消亡的過程特征:動態產生,動態消亡。進程是并發性的。進程獨立性。是一個獨立運行的基本單位,也是系統分配資源和調度的基本單位1.2、線程多線程是實現并發機制的一種有效手段。進程和線程一樣,都是實現并發的一個基本單位線程:進程內部的一個執行單元,它是程序中一個單一的順序控制流程特點:
  • 線程依賴進程生存
  • 一個進程可以包含多個線程,而一個線程至少要有一個父進程
  • 線程可以有自己的堆棧,程序計數器和局部變量。
  • 線程與父進程的其他線程共享進程所有的全部資源
  • 線程是獨立運行,采用搶占方式。
  • 一個線程可以創建和刪除別外一具線程
  • 同一個進程中的多個線程之間可以并發執行
  • 線程的調試管理是由進程來完成的。
  • 原則:編程時,必須確保線程不會妨礙同一進程的其他線程
1.3、線程分類
  • 系統級線程:又稱核心級線程,負責管理調度不同進程之間的多個線程,由操作系統直接管理
  • 用戶級線程:僅存于用戶空間,在應用 程序中控制其創建,執行和消亡
1.4、多線程優勢
  • 改善用戶體驗
  • 提高資源的利用率
二、Java中線程的實現
  • 一種是繼承Thread類
  • 另一種就是實現Runnable接口

使用步驟:

定義一個線程----創建線程的實例--啟動線程--終止線程

2.1、繼承Thread類Thread類是在java.lang包中定義的,一個類只要繼承了Thread類,此類就稱為多線程操作類。在Thread子類之中,必須明確的覆寫Thread類中的run()方法,此方法為線程的主體
/** * 繼承Thread類重寫run方法 * */public class MyThead1 extends Thread {    PRivate int count;    @Override    public void run() {        System.out.println("=======線程啟動了=======");        while(this.count<100){            count++;                    }        System.out.println("count最終的值:"+count);    }    public int getCount() {        return count;    }    public void setCount(int count) {        this.count = count;    }    }

測試類

/** * 測試類 * MyTheadDemo * 繼承Thread類創建線程 * 1.繼承Thread類 * 2.重寫run方法 * 3.實例化線程類對象 * 4.調用start方法啟動線程 *  * 繼承Thread類存在問題 * Java中是單繼承的,線程類不能繼承其它的類 *  * 解決辦法:實現Runnable接口 * */public class MyTheadDemo1 {    public static void main(String[] args) {        //實例化線程類對象        MyThead1 myThead1=new MyThead1();        //啟動線程        myThead1.start();        /*         * start方法的作用         * 該方法公使操作系統初始化一個新的線程         * 由這個新線程來執行線程對象的Run方法         */    }}

2.2、實現Runnable接口(推薦使用,使用接口可以解決Java中單繼承的問題)在Java中也可以通過實現Runnable接口的方式實現多線程,Runnable接口中只定義了一個抽象方法:public void run() ;
/** * 實現Runnable接口 * */public class MyRunnable implements Runnable {    private int count;    @Override    public void run() {        System.out.println("=======線程啟動了=======");        while(this.count<100){            count++;                    }        System.out.println("count最終的值:"+count);    }    public int getCount() {        return count;    }    public void setCount(int count) {        this.count = count;    }    }

測試類

/** * 測試類 * MyRunnable * 實現Runnable接口創建線程 * 1.實現Runnable接口 * 2.實現run方法 * 3.實例化線程類對象 * 4.創建Thread類實例對象,并將實例化的線程對象傳入 * 5.調用Thread類實例對象的start方法啟動線程 * */public class MyRunnableDemo {    public static void main(String[] args) {        //實例化線程類對象        Runnable myRunnable=new MyRunnable();        Thread thread=new Thread(myRunnable);        //或者Thread thread=new Thread(new MyRunnable());        //啟動線程        thread.start();    }}

2.3、啟動線程
  • 繼承Thread類啟動線程方法:
如果要想正確的啟動線程,是不能直接調用run()方法的,應該調用從Thread類中繼承而來的start()方法,才可以啟動線程
  • 實現Runnable接口啟動線程方法:
實際上此時,還是要依靠Thread類完成啟動,在Thread類中提供了以下的兩個構造方法:public Thread(Runnable target)public Thread(Runnable target,String name)2.4、Thread類和Runnable接口的區別Thread類和Runnable接口之間在使用上也是有所區別的,如果一個類繼承Thread類,則不適合于多個線程共享資源,而實現了Runnable接口,則可以方便的實現資源的共享。
/** * 實現Runnable接口 * */public class MyRunnable implements Runnable {    private int count;    @Override    public void run() {            count++;        System.out.println("count最終的值:"+count);    }    public int getCount() {        return count;    }    public void setCount(int count) {        this.count = count;    }    }

測試類

/** * 測試類 * MyRunnable * 實現Runnable接口創建線程 * 1.實現Runnable接口 * 2.實現run方法 * 3.實例化線程類對象 * 4.創建Thread類實例對象,并將實例化的線程對象傳入 * 5.調用Thread類實例對象的start方法啟動線程 * */public class MyRunnableDemo {    public static void main(String[] args) {        //實例化線程類對象        Runnable myRunnable=new MyRunnable();        Thread thread=new Thread(myRunnable);        Thread thread2=new Thread(myRunnable);        //或者Thread thread=new Thread(new MyRunnable());        //啟動線程        System.out.println("線程1啟動");        thread.start();            System.out.println("線程2啟動");        thread2.start();    }}

結果:

線程1啟動線程2啟動count最終的值:1count最終的值:2

再看下thread方式

/** * 繼承Thread類重寫run方法 * */public class MyThead1 extends Thread {    private int count;    @Override    public void run() {                count++;        System.out.println("count最終的值:"+count);    }    public int getCount() {        return count;    }    public void setCount(int count) {        this.count = count;    }    }
/** * 測試類 * MyTheadDemo * 實現Runnable接口創建純種 * 1.實現Runnable接口 * 2.重寫run方法 * 3.實例化線程類對象 * 4.調用start方法啟動線程 *  * 繼承Thread類存在問題 * Java中是單繼承的,線程類不能繼承其它的類 *  * 解決辦法:實現Runnable接口 * */public class MyTheadDemo1 {    public static void main(String[] args) {        //實例化線程類對象        MyThead1 myThead1=new MyThead1();        MyThead1 myThead2=new MyThead1();        //啟動線程        System.out.println("線程1啟動");        myThead1.start();        System.out.println("線程2啟動");        myThead2.start();        /*         * start方法的作用         * 該方法公使操作系統初始化一個新的線程         * 由這個新線程來執行線程對象的Run方法         */    }}

結果:

線程1啟動線程2啟動count最終的值:1count最終的值:1

三、線程的狀態要想實現多線程,必須在主線程中創建新的線程對象。任何線程一般具有五種狀態,即創建、就緒、運行、阻塞、終止。四、線程的優先級和方法4.1、線程的優先級
  • 默認情況下,一個線程繼承其父類的優先級
  • 優先級表示為一個整數值
  • 優先級越高,執行的機會越大,反之,執行的機會就越小
  • 高優先級的線程可以搶占低優先級線程的CPU資源
  • 線程的優先級與線程執行的效率沒有必然的聯系

4.2、線程的方法

No.方法名稱類型描述
1public Thread(Runnable target)構造接收Runnable接口子類對象,實例化Thread對象
2public Thread(Runnable target,String name)構造接收Runnable接口子類對象,實例化Thread對象,并設置線程名稱
3public Thread(String name)構造實例化Thread對象,并設置線程名稱
4public static Thread currentThread()普通返回目前正在執行的線程
5public final String getName()普通返回線程的名稱
6public final int getPriority()普通發揮線程的優先級
7public boolean isInterrupted()普通判斷目前線程是否被中斷,如果是,返回true,否則返回false
8public final boolean isAlive()普通判斷線程是否在活動,如果是,返回true,否則返回false
9public final void join() throws InterruptedException普通等待線程死亡
10public final synchronized void join(long millis) throws InterruptedException普通等待millis毫秒后,線程死亡
11public void run()普通執行線程
12public final void setName(String name)普通設定線程名稱
13public final void setPriority(int newPriority)普通設定線程的優先值
14public static void sleep(long millis) throws InterruptedException普通使目前正在執行的線程休眠millis毫秒
15public void start()普通開始執行線程
16public static void yield()普通將目前正在執行的線程暫停,允許其它線程執行
17public final void setDaemon(boolean on)普通將一個線程設置成后臺運行
18public final void setPriority(int newPriority)普通更改線程的優先級
五、線程調度5.1、join()方法

作用:阻塞指定的線程等到另一個線程完成以后,再繼續執行

package thead;/** * 實現join方法 * 1.join的線程運行完成后,才會繼承運行當前線程 * 2.join之前要先啟動線程start方法 * */public class JoinRunnable implements Runnable {    @Override    public void run() {        for (int i = 0; i <5; i++) {            System.out.println(Thread.currentThread().getName()+"  第"+i+"次");        }    }        public static void main(String[] args) {        //主線程        for (int i = 0; i <10; i++) {            if(i==5){                Thread thread=new Thread(new JoinRunnable());;                thread.setName("半路切入的線程:");                try {                    //啟動線程                    thread.start();                    //半路加入線程                    thread.join();                } catch (InterruptedException e) {                    e.printStackTrace();                }            }            System.out.println(Thread.currentThread().getName()+"   第"+i+"次");        }    }}

結果:

main   第0次main   第1次main   第2次main   第3次main   第4次半路切入的線程:  第0次半路切入的線程:  第1次半路切入的線程:  第2次半路切入的線程:  第3次半路切入的線程:  第4次main   第5次main   第6次main   第7次main   第8次main   第9次

5.2、sleep()阻塞當前線程,當前等待的線程將獲得機會

調用sleep方法后,,當前線程會被扶起(暫停執行)當前線程會釋放資源

package thead;public class SleepRunnable implements Runnable {    @Override    public void run() {        try {            for (int i = 0; i < 10; i++) {                                //每一秒執行一次            Thread.sleep(1000);            System.out.println(Thread.currentThread().getName()+i);            }        } catch (InterruptedException e) {            e.printStackTrace();        }    }    public static void main(String[] args) {        Thread sleepThread=new Thread(new SleepRunnable());        sleepThread.setName("等待中的線程");        sleepThread.start();        for (int i = 0; i < 10; i++) {            if(i==5){                try {                    //主線程=等5秒                    Thread.sleep(5000);                                    } catch (InterruptedException e) {                    e.printStackTrace();                }            }            System.out.println(Thread.currentThread().getName()+i);        }                }    }

結果:

main0main1main2main3main4等待中的線程0等待中的線程1等待中的線程2等待中的線程3main5main6main7main8main9等待中的線程4等待中的線程5等待中的線程6等待中的線程7等待中的線程8等待中的線程9

5.3、yield()方法

將當前線程轉入可運行狀態,

package yield;/** * 線程一 * */public class MyThread1 implements Runnable {    @Override    public void run() {        for (int i = 0; i <10; i++) {            Thread.yield();            System.out.println(Thread.currentThread().getName()+":"+i);        }    }}package yield;/** * 線程二 * */public class MyThread2 implements Runnable {    @Override    public void run() {        for (int i = 0; i <10; i++) {            Thread.yield();            System.out.println(Thread.currentThread().getName()+": "+i);        }    }}package yield;/** * yield方法使用 *2個線程搶占方式 */public class Test {    public static void main(String[] args) {        Thread myThread1=new Thread(new MyThread1());        myThread1.setName("線程1");        Thread myThread2=new Thread(new MyThread2());        myThread2.setName("線程2");        //同時啟動2個線程        myThread1.start();        myThread2.start();    }}

結果:

線程2: 0線程1:0線程2: 1線程1:1線程2: 2線程1:2線程2: 3線程1:3線程1:4線程2: 4線程1:5線程1:6線程1:7線程1:8線程1:9線程2: 5線程2: 6線程2: 7線程2: 8線程2: 9

sleep()和yield()方法比較

  • sleep()方法使當前線程轉入被阻塞的狀態,而yield()方法使用當前線程轉入可運行狀態
  • sleep()方法總是強制當前線程停止執行,百yield() 方法不一定
  • sleep()方法可以使其它等待運行的線程有同樣的執行級別而yield()方法只使相同或者更高優先級的線程獲得執行機會
  • 使用sleep()方法時需要捕獲異常,而yield()方法無需要捕獲異常

5.4、setDaemon()方法

將線程設置 為后臺線程(守護線程)。

只能在線程啟動之前設置.

package thead;public class Daemon implements Runnable {    @Override    public void run() {    for (int i = 0; i <10; i++) {        System.out.println(Thread.currentThread().getName()+":"+i);    }    }    public static void main(String[] args) {        Thread daemon=new Thread(new Daemon());        daemon.setName("后臺線程");        // 設置為后臺線程        daemon.setDaemon(true);        daemon.start();        for (int i = 0; i <10; i++) {            System.out.println(Thread.currentThread().getName()+":"+i);        }            }}

六、同步一個多線程的程序,如果是通過Runnable接口實現的,則意味著類中的屬性將被多個線程共享,那么這樣一來就會造成一種問題,如果這多個線程要操作同一資源的時候就有可能出現資源的同步問題。例如:以之前的賣票程序來講,如果多個線程同時操作的時候就有可能出現賣出票為負數的問題。問題的解決如果想解決這樣的問題,就必須使用同步,所謂的同步就是指多個操作在同一個時間段內只能有一個線程進行,其他線程要等待此線程完成之后才可以繼續執行解決資源共享的同步操作,可以使用同步代碼塊和同步方法兩種方式完成同步代碼塊在代碼塊上加上“synchronized”關鍵字的話,則此代碼塊就稱為同步代碼塊。同步方法除了可以將需要的代碼設置成同步代碼塊之外,也可以使用synchronized關鍵字將一個方法聲明成同步方法。同步方法定義格式:synchronized 方法返回值 方法名稱(參數列表){}6.1、簡單例子

同一賬戶2個人同時取款

package demo;public class Account {        //余額    private int balance=500;    //檢查余額    public int getBalance() {        return balance;    }    //取款    public void withDraw(int amount){        balance=balance-amount;    }            public void setBalance(int balance) {        this.balance = balance;    }    }package demo;public class TestAccount implements Runnable{    private Account account=new Account();                @Override    public void run() {    for (int i = 0; i <5; i++) {        //一次取走100        makeWithDraw(100);        if(account.getBalance()<0){            System.out.println("賬戶透支了!!!!!");        }            }            }    //取款參數  同步方法    private synchronized void makeWithDraw(int amount){        if(account.getBalance()>=amount){            //當前余額是否足夠可以取款            System.out.println(Thread.currentThread().getName()+"  準備取款");            try {                //0.5秒后取款                Thread.sleep(500);            } catch (InterruptedException e) {                // TODO Auto-generated catch block                e.printStackTrace();            }            //完成取款            account.withDraw(amount);            System.out.println(Thread.currentThread().getName()+"  完成取款,當前余額為: "+account.getBalance());                    }else{            //如果余額不足不能取款            System.out.println(Thread.currentThread().getName()+"  余額不足以支付當前取款, 余額為:  "                    +account.getBalance());        }    }        }

測試類

package demo;/** * 如果一個資源被多個線程使用,不上鎖就會造成讀取嚴重錯誤 * 如果想讓當前資源被一個線程使用時,不會受到其他純種的影響,應該給當前資源上鎖 * Java中使用sychronized關鍵字保證數據同步 * */public class Test {    public static void main(String[] args) {        //創建線程類的實例        TestAccount ta=new TestAccount();        //創建線程        Thread thread1=new Thread(ta);        thread1.setName("張三");        Thread thread2=new Thread(ta);        thread2.setName("張三的妻子");        //啟動線程        thread1.start();        thread2.start();    }}

上面是同步方法

下面是同步代碼塊

package demo;public class TestAccount implements Runnable{    private Account account=new Account();                @Override    public void run() {    for (int i = 0; i <5; i++) {        //一次取走100        makeWithDraw(100);        if(account.getBalance()<0){            System.out.println("賬戶透支了!!!!!");        }            }            }    //取款參數    private  void makeWithDraw(int amount){        //同步代碼塊        synchronized (account){        if(account.getBalance()>=amount){            //當前余額是否足夠可以取款            System.out.println(Thread.currentThread().getName()+"  準備取款");            try {                //0.5秒后取款                Thread.sleep(500);            } catch (InterruptedException e) {                // TODO Auto-generated catch block                e.printStackTrace();            }            //完成取款            account.withDraw(amount);            System.out.println(Thread.currentThread().getName()+"  完成取款,當前余額為: "+account.getBalance());                    }else{            //如果余額不足不能取款            System.out.println(Thread.currentThread().getName()+"  余額不足以支付當前取款, 余額為:  "                    +account.getBalance());        }    }    }    }

七、線程間通信的實現
  • wait()方法:
  • notify()方法:
  • notifyAll()方法:

以上3個方法只能在同步方式或者同步代碼塊中使用

wait()方法:會掛起當前的線程,并且釋放共享資源的鎖。當前線程會從可運行狀態轉為阻塞狀態直到調用了wait()方法所屬的那個對象的notify()方法或者notifyAll()方法.

notify()方法:可以喚醒因為調用wait()方法而被掛起的那個線程,并且使這個線程退出阻塞狀態進入可運行狀態

notifyAll()方法:可以喚醒因為所有調用wait()方法而被掛起的那個線程,并且使這些線程退出阻塞狀態進入可運行狀態

生產者和消費者
package com.pb;/** * 商品共享數據 * */public class SharedData {    private char c;    private boolean idProducted=false;//信號量    //同步方法生產者生產產品的的方法    public synchronized void putSharedChar(char c){        //如果產品還沒有被消費,則生產都等待        if(idProducted){            try {                System.out.println("消費者還未消費,因此生產都停止生產");                wait();            } catch (InterruptedException e) {                                e.printStackTrace();            }        }        this.c=c;        idProducted=true;  //標記已經生產        notify();//通知消費都        System.out.println("生產者生產了產品"+c+",通知消費者");    }    //同步方法   消費者消費產品的的方法        public synchronized char getSharedChar(char c){            //如果產品還沒有被消費,則生產都等待            if(idProducted==false){                try {                    System.out.println("生產者還未生產,消費者停止消費");                    wait();                } catch (InterruptedException e) {                                        e.printStackTrace();                }            }                        idProducted=false;  //標記已經消費            notify();//通知生產者            System.out.println("消費者消費了產品"+c+",通知生產者");            return this.c;                    }}

package com.pb;/** * 生產者 * */public class Producer implements Runnable {    //共享數據    private SharedData sharedData;        public Producer(SharedData sharedData){        this.sharedData=sharedData;    }        @Override    public void run() {        for (char c = 'A'; c <= 'D'; c++) {                        try {                Thread.sleep((int)Math.random()*3000);                            } catch (InterruptedException e) {                            e.printStackTrace();            }            //將產品生產后,放入倉庫            sharedData.putSharedChar(c);        }    }}

package com.pb;/** * 消費者 * */public class Consumer implements Runnable {    //共享數據        private SharedData sharedData;                public Consumer(SharedData sharedData){            this.sharedData=sharedData;        }    @Override    public void run() {        char ch = 0;        do {            try {                Thread.sleep((int)Math.random()*3000);                            } catch (InterruptedException e) {                            e.printStackTrace();            }            //從倉庫中取中產品            ch=sharedData.getSharedChar(ch);        } while (ch!='D');    }}

測試類

package com.pb;public class CommunicationDemo {    public static void main(String[] args) {        //共享資源,產品        SharedData sharedData=new SharedData();        Thread producer=new Thread(new Producer(sharedData));        Thread consumer=new Thread(new Consumer(sharedData));                //啟動線程        consumer.start();        producer.start();            }}

結果:

生產者還未生產,消費者停止消費生產者生產了產品A,通知消費者消費者消費了產品A,通知生產者生產者生產了產品B,通知消費者生產者還未生產,消費者停止消費生產者生產了產品C,通知消費者消費者消費了產品B,通知生產者生產者生產了產品D,通知消費者消費者消費了產品C,通知生產者


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品扒开腿做爽爽爽男男| 欧美性猛交xxxx乱大交3| 91色在线观看| 亚洲伊人一本大道中文字幕| 成人看片人aa| 亚洲精品视频在线观看视频| 日韩av色在线| 日韩有码在线播放| 亚洲qvod图片区电影| 日韩在线观看免费高清| 69av视频在线播放| 国产精品精品一区二区三区午夜版| 亚洲一区第一页| 欧美日韩午夜剧场| 亚洲第一级黄色片| 亚洲人精品午夜在线观看| 亚洲全黄一级网站| 成人av在线天堂| 国产欧美一区二区三区视频| 岛国av在线不卡| 亚洲一区二区久久久久久久| 中文字幕精品视频| 欧美性色xo影院| 国产精品第一第二| 日韩av片永久免费网站| 成人中文字幕在线观看| 亚洲国产欧美一区二区丝袜黑人| 中文字幕日韩欧美在线视频| 日韩黄色在线免费观看| 欧美在线观看一区二区三区| 日韩在线播放一区| 亚洲淫片在线视频| 国产不卡一区二区在线播放| 国产日韩精品在线播放| 爽爽爽爽爽爽爽成人免费观看| 国产一区红桃视频| 国产自产女人91一区在线观看| 日韩中文字幕精品| 91久久中文字幕| 成人午夜在线影院| 国产精品久久久久久久久久ktv| 亚洲аv电影天堂网| 亚洲精品永久免费| 在线观看国产成人av片| 国产欧洲精品视频| 欧美香蕉大胸在线视频观看| 欧美老女人在线视频| 精品一区二区三区电影| 45www国产精品网站| 色视频www在线播放国产成人| 午夜精品一区二区三区av| 久久久噜噜噜久久久| 国产欧亚日韩视频| 久久精品在线播放| 色综合91久久精品中文字幕| 成人免费福利在线| 亚洲free性xxxx护士白浆| 中文字幕在线视频日韩| 欧美大片在线看免费观看| 日本久久久久亚洲中字幕| 欧美激情精品久久久久久蜜臀| 一道本无吗dⅴd在线播放一区| 黑人狂躁日本妞一区二区三区| 亚洲视频日韩精品| 欧美日韩激情视频8区| 奇米成人av国产一区二区三区| 97在线看福利| 亚洲欧美日韩在线高清直播| 欧美激情欧美激情在线五月| 久久精品国产清自在天天线| 国产成人在线一区| 欧美性xxxxxxx| 精品成人69xx.xyz| 欧美视频在线免费看| 中文字幕日韩在线观看| 欧美日韩午夜视频在线观看| 国产欧美亚洲精品| 欧美美女操人视频| 日韩在线观看视频免费| 亚洲影影院av| 亚洲视频欧美视频| 亚洲男人天堂古典| 久久九九免费视频| 91精品国产91久久久久久最新| 欧美日韩激情美女| 91精品国产91久久久久久最新| 色无极影院亚洲| 欧美激情亚洲国产| 黄色成人av在线| 欧美成aaa人片免费看| 亚洲精品免费在线视频| 91在线观看免费高清| 97色在线播放视频| 国产精品视频一区二区三区四| 亚洲人成在线电影| 精品国产户外野外| 久久69精品久久久久久国产越南| 久久精品在线播放| 欧美另类69精品久久久久9999| 欧美高清一级大片| 成人国产精品久久久久久亚洲| 午夜精品美女自拍福到在线| 久久99精品久久久久久琪琪| 日韩理论片久久| 久久久视频免费观看| 欧美性猛交xxxxx水多| 精品久久在线播放| 亚洲天堂av在线免费| 久久全球大尺度高清视频| 国产日韩欧美在线看| 日韩中文字幕在线播放| 欧美性猛交xxxxx免费看| 欧美激情视频网址| 成人久久一区二区| 国产日产欧美a一级在线| 久久久999成人| 亚洲a级在线观看| 久久综合免费视频影院| 亚洲理论电影网| x99av成人免费| 亚洲欧美国产精品专区久久| 97视频在线观看免费高清完整版在线观看| 91久久在线观看| 国产精品久久久久久久久粉嫩av| 国外成人在线直播| 欧美极品美女电影一区| 久久精彩免费视频| 精品伊人久久97| www.欧美视频| 欧美性受xxxx黑人猛交| 青青草成人在线| 亚洲免费一在线| 欧美人在线观看| 亚洲欧美激情四射在线日| 人九九综合九九宗合| 国产精品电影网站| 国产精品中文字幕在线观看| 久久成人人人人精品欧| 国产精品久久av| 91久热免费在线视频| 一区二区三区视频免费在线观看| 亚洲老头老太hd| 国产日本欧美一区二区三区在线| 国产美女精品视频| 久久躁狠狠躁夜夜爽| 国自产精品手机在线观看视频| 欧美性猛交xxx| 日韩少妇与小伙激情| 欧美贵妇videos办公室| 亚洲直播在线一区| 国产日韩在线观看av| 国产精品久久久久福利| 国产精品天天狠天天看| 日韩色av导航| 日韩欧美高清视频| 亚洲大胆人体av| 国产精品一区二区av影院萌芽| 国内精品国产三级国产在线专| 欧美日韩国产在线| 国产精品普通话| 午夜精品久久久久久久久久久久| 欧美综合在线第二页| 91成品人片a无限观看| 亚洲欧美日本精品|