日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java多线程超详细总结

發(fā)布時間:2024/4/17 java 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java多线程超详细总结 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

目錄(?)[-]

?

?

?

  • 一擴展javalangThread類
  • 二實現(xiàn)javalangRunnable接口
  • 三Thread和Runnable的區(qū)別
  • 四線程狀態(tài)轉(zhuǎn)換
  • 五線程調(diào)度
  • 六常用函數(shù)說明
  • 使用方式
  • 為什么要用join方法
  • 七常見線程名詞解釋
  • 八線程同步
  • 九線程數(shù)據(jù)傳遞
  • ? ? ?本文主要講了java中多線程的使用方法、線程同步、線程數(shù)據(jù)傳遞、線程狀態(tài)及相應(yīng)的一些線程函數(shù)用法、概述等。

    首先講一下進程和線程的區(qū)別:

      進程:每個進程都有獨立的代碼和數(shù)據(jù)空間(進程上下文),進程間的切換會有較大的開銷,一個進程包含1--n個線程。

      線程:同一類線程共享代碼和數(shù)據(jù)空間,每個線程有獨立的運行棧和程序計數(shù)器(PC),線程切換開銷小。

      線程和進程一樣分為五個階段:創(chuàng)建、就緒、運行、阻塞、終止。

      多進程是指操作系統(tǒng)能同時運行多個任務(wù)(程序)。

      多線程是指在同一程序中有多個順序流在執(zhí)行。

    java中要想實現(xiàn)多線程,有兩種手段,一種是繼續(xù)Thread類,另外一種是實現(xiàn)Runable接口。

    一、擴展java.lang.Thread類

    package com.multithread.learning; /***@functon 多線程學(xué)習(xí)*@author 林炳文*@time 2015.3.9*/ class Thread1 extends Thread{private String name;public Thread1(String name) {this.name=name;}public void run() {for (int i = 0; i < 5; i++) {System.out.println(name + "運行 : " + i);try {sleep((int) Math.random() * 10);} catch (InterruptedException e) {e.printStackTrace();}}} } public class Main {public static void main(String[] args) {Thread1 mTh1=new Thread1("A");Thread1 mTh2=new Thread1("B");mTh1.start();mTh2.start();}}

    輸出:

    A運行? :? 0
    B運行? :? 0
    A運行? :? 1
    A運行? :? 2
    A運行? :? 3
    A運行? :? 4
    B運行? :? 1
    B運行? :? 2
    B運行? :? 3
    B運行? :? 4

    再運行一下:

    A運行? :? 0
    B運行? :? 0
    B運行? :? 1
    B運行? :? 2
    B運行? :? 3
    B運行? :? 4
    A運行? :? 1
    A運行? :? 2
    A運行? :? 3
    A運行? :? 4

    說明: 程序啟動運行main時候,java虛擬機啟動一個進程,主線程main在main()調(diào)用時候被創(chuàng)建。隨著調(diào)用MitiSay的兩個對象的start方法,另外兩個線程也啟動了,這樣,整個應(yīng)用就在多線程下運行。 注意:start()方法的調(diào)用后并不是立即執(zhí)行多線程代碼,而是使得該線程變?yōu)榭蛇\行態(tài)(Runnable),什么時候運行是由操作系統(tǒng)決定的。 從程序運行的結(jié)果可以發(fā)現(xiàn),多線程程序是亂序執(zhí)行。因此,只有亂序執(zhí)行的代碼才有必要設(shè)計為多線程。 Thread.sleep()方法調(diào)用目的是不讓當前線程獨自霸占該進程所獲取的CPU資源,以留出一定時間給其他線程執(zhí)行的機會。 實際上所有的多線程代碼執(zhí)行順序都是不確定的,每次執(zhí)行的結(jié)果都是隨機的。

    ?

    但是start方法重復(fù)調(diào)用的話,會出現(xiàn)java.lang.IllegalThreadStateException異常。

    Thread1 mTh1=new Thread1("A");Thread1 mTh2=mTh1;mTh1.start();mTh2.start();


    輸出:

    Exception in thread "main" java.lang.IllegalThreadStateException
    ?? ?at java.lang.Thread.start(Unknown Source)
    ?? ?at com.multithread.learning.Main.main(Main.java:31)
    A運行? :? 0
    A運行? :? 1
    A運行? :? 2
    A運行? :? 3
    A運行? :? 4

    二、實現(xiàn)java.lang.Runnable接口

    /***@functon 多線程學(xué)習(xí)*@author 林炳文*@time 2015.3.9*/ package com.multithread.runnable; class Thread2 implements Runnable{private String name;public Thread2(String name) {this.name=name;}@Overridepublic void run() {for (int i = 0; i < 5; i++) {System.out.println(name + "運行 : " + i);try {Thread.sleep((int) Math.random() * 10);} catch (InterruptedException e) {e.printStackTrace();}}}} public class Main {public static void main(String[] args) {new Thread(new Thread2("C")).start();new Thread(new Thread2("D")).start();}}

    輸出:

    C運行? :? 0
    D運行? :? 0
    D運行? :? 1
    C運行? :? 1
    D運行? :? 2
    C運行? :? 2
    D運行? :? 3
    C運行? :? 3
    D運行? :? 4
    C運行? :? 4

    說明: Thread2類通過實現(xiàn)Runnable接口,使得該類有了多線程類的特征。run()方法是多線程程序的一個約定。所有的多線程代碼都在run方法里面。Thread類實際上也是實現(xiàn)了Runnable接口的類。 在啟動的多線程的時候,需要先通過Thread類的構(gòu)造方法Thread(Runnable target) 構(gòu)造出對象,然后調(diào)用Thread對象的start()方法來運行多線程代碼。 實際上所有的多線程代碼都是通過運行Thread的start()方法來運行的。因此,不管是擴展Thread類還是實現(xiàn)Runnable接口來實現(xiàn)多線程,最終還是通過Thread的對象的API來控制線程的,熟悉Thread類的API是進行多線程編程的基礎(chǔ)。

    三、Thread和Runnable的區(qū)別

    如果一個類繼承Thread,則不適合資源共享。但是如果實現(xiàn)了Runable接口的話,則很容易的實現(xiàn)資源共享。

    package com.multithread.learning; /***@functon 多線程學(xué)習(xí),繼承Thread,資源不能共享*@author 林炳文*@time 2015.3.9*/ class Thread1 extends Thread{private int count=5;private String name;public Thread1(String name) {this.name=name;}public void run() {for (int i = 0; i < 5; i++) {System.out.println(name + "運行 count= " + count--);try {sleep((int) Math.random() * 10);} catch (InterruptedException e) {e.printStackTrace();}}} }public class Main {public static void main(String[] args) {Thread1 mTh1=new Thread1("A");Thread1 mTh2=new Thread1("B");mTh1.start();mTh2.start();}}

    輸出:

    B運行? count= 5
    A運行? count= 5
    B運行? count= 4
    B運行? count= 3
    B運行? count= 2
    B運行? count= 1
    A運行? count= 4
    A運行? count= 3
    A運行? count= 2
    A運行? count= 1

    從上面可以看出,不同的線程之間count是不同的,這對于賣票系統(tǒng)來說就會有很大的問題,當然,這里可以用同步來作。這里我們用Runnable來做下看看

    /***@functon 多線程學(xué)習(xí) 繼承runnable,資源能共享*@author 林炳文*@time 2015.3.9*/ package com.multithread.runnable; class Thread2 implements Runnable{private int count=15;@Overridepublic void run() {for (int i = 0; i < 5; i++) {System.out.println(Thread.currentThread().getName() + "運行 count= " + count--);try {Thread.sleep((int) Math.random() * 10);} catch (InterruptedException e) {e.printStackTrace();}}}} public class Main {public static void main(String[] args) {Thread2 my = new Thread2();new Thread(my, "C").start();//同一個mt,但是在Thread中就不可以,如果用同一個實例化對象mt,就會出現(xiàn)異常 new Thread(my, "D").start();new Thread(my, "E").start();}}


    輸出:

    C運行? count= 15
    D運行? count= 14
    E運行? count= 13
    D運行? count= 12
    D運行? count= 10
    D運行? count= 9
    D運行? count= 8
    C運行? count= 11
    E運行? count= 12
    C運行? count= 7
    E運行? count= 6
    C運行? count= 5
    E運行? count= 4
    C運行? count= 3
    E運行? count= 2

    這里要注意每個線程都是用同一個實例化對象,如果不是同一個,效果就和上面的一樣了!

    總結(jié):

    實現(xiàn)Runnable接口比繼承Thread類所具有的優(yōu)勢:

    1):適合多個相同的程序代碼的線程去處理同一個資源

    2):可以避免java中的單繼承的限制

    3):增加程序的健壯性,代碼可以被多個線程共享,代碼和數(shù)據(jù)獨立

    ?

    ?

    提醒一下大家:main方法其實也是一個線程。在java中所以的線程都是同時啟動的,至于什么時候,哪個先執(zhí)行,完全看誰先得到CPU的資源。

    ?

    java中,每次程序運行至少啟動2個線程。一個是main線程,一個是垃圾收集線程。因為每當使用java命令執(zhí)行一個類的時候,實際上都會啟動一個JVM,每一個jVM實習(xí)在就是在操作系統(tǒng)中啟動了一個進程。

    四、線程狀態(tài)轉(zhuǎn)換

    1、新建狀態(tài)(New):新創(chuàng)建了一個線程對象。 2、就緒狀態(tài)(Runnable):線程對象創(chuàng)建后,其他線程調(diào)用了該對象的start()方法。該狀態(tài)的線程位于可運行線程池中,變得可運行,等待獲取CPU的使用權(quán)。 3、運行狀態(tài)(Running):就緒狀態(tài)的線程獲取了CPU,執(zhí)行程序代碼。 4、阻塞狀態(tài)(Blocked):阻塞狀態(tài)是線程因為某種原因放棄CPU使用權(quán),暫時停止運行。直到線程進入就緒狀態(tài),才有機會轉(zhuǎn)到運行狀態(tài)。阻塞的情況分三種: (一)、等待阻塞:運行的線程執(zhí)行wait()方法,JVM會把該線程放入等待池中。 (二)、同步阻塞:運行的線程在獲取對象的同步鎖時,若該同步鎖被別的線程占用,則JVM會把該線程放入鎖池中。 (三)、其他阻塞:運行的線程執(zhí)行sleep()或join()方法,或者發(fā)出了I/O請求時,JVM會把該線程置為阻塞狀態(tài)。當sleep()狀態(tài)超時、join()等待線程終止或者超時、或者I/O處理完畢時,線程重新轉(zhuǎn)入就緒狀態(tài)。 5、死亡狀態(tài)(Dead):線程執(zhí)行完了或者因異常退出了run()方法,該線程結(jié)束生命周期。

    五、線程調(diào)度

    線程的調(diào)度

    1、調(diào)整線程優(yōu)先級:Java線程有優(yōu)先級,優(yōu)先級高的線程會獲得較多的運行機會。 Java線程的優(yōu)先級用整數(shù)表示,取值范圍是1~10,Thread類有以下三個靜態(tài)常量: static int MAX_PRIORITY 線程可以具有的最高優(yōu)先級,取值為10。 static int MIN_PRIORITY 線程可以具有的最低優(yōu)先級,取值為1。 static int NORM_PRIORITY 分配給線程的默認優(yōu)先級,取值為5。 Thread類的setPriority()和getPriority()方法分別用來設(shè)置和獲取線程的優(yōu)先級。 每個線程都有默認的優(yōu)先級。主線程的默認優(yōu)先級為Thread.NORM_PRIORITY。 線程的優(yōu)先級有繼承關(guān)系,比如A線程中創(chuàng)建了B線程,那么B將和A具有相同的優(yōu)先級。 JVM提供了10個線程優(yōu)先級,但與常見的操作系統(tǒng)都不能很好的映射。如果希望程序能移植到各個操作系統(tǒng)中,應(yīng)該僅僅使用Thread類有以下三個靜態(tài)常量作為優(yōu)先級,這樣能保證同樣的優(yōu)先級采用了同樣的調(diào)度方式。 2、線程睡眠:Thread.sleep(long millis)方法,使線程轉(zhuǎn)到阻塞狀態(tài)。millis參數(shù)設(shè)定睡眠的時間,以毫秒為單位。當睡眠結(jié)束后,就轉(zhuǎn)為就緒(Runnable)狀態(tài)。sleep()平臺移植性好。 3、線程等待:Object類中的wait()方法,導(dǎo)致當前的線程等待,直到其他線程調(diào)用此對象的 notify() 方法或 notifyAll() 喚醒方法。這個兩個喚醒方法也是Object類中的方法,行為等價于調(diào)用 wait(0) 一樣。 4、線程讓步:Thread.yield() 方法,暫停當前正在執(zhí)行的線程對象,把執(zhí)行機會讓給相同或者更高優(yōu)先級的線程。 5、線程加入:join()方法,等待其他線程終止。在當前線程中調(diào)用另一個線程的join()方法,則當前線程轉(zhuǎn)入阻塞狀態(tài),直到另一個進程運行結(jié)束,當前線程再由阻塞轉(zhuǎn)為就緒狀態(tài)。 6、線程喚醒:Object類中的notify()方法,喚醒在此對象監(jiān)視器上等待的單個線程。如果所有線程都在此對象上等待,則會選擇喚醒其中一個線程。選擇是任意性的,并在對實現(xiàn)做出決定時發(fā)生。線程通過調(diào)用其中一個 wait 方法,在對象的監(jiān)視器上等待。 直到當前的線程放棄此對象上的鎖定,才能繼續(xù)執(zhí)行被喚醒的線程。被喚醒的線程將以常規(guī)方式與在該對象上主動同步的其他所有線程進行競爭;例如,喚醒的線程在作為鎖定此對象的下一個線程方面沒有可靠的特權(quán)或劣勢。類似的方法還有一個notifyAll(),喚醒在此對象監(jiān)視器上等待的所有線程。 注意:Thread中suspend()和resume()兩個方法在JDK1.5中已經(jīng)廢除,不再介紹。因為有死鎖傾向。

    六、常用函數(shù)說明

    ①sleep(long millis):?在指定的毫秒數(shù)內(nèi)讓當前正在執(zhí)行的線程休眠(暫停執(zhí)行)

    ②join():指等待t線程終止。

    使用方式。

    join是Thread類的一個方法,啟動線程后直接調(diào)用,即join()的作用是:“等待該線程終止”,這里需要理解的就是該線程是指的主線程等待子線程的終止。也就是在子線程調(diào)用了join()方法后面的代碼,只有等到子線程結(jié)束了才能執(zhí)行。

    Thread t = new AThread(); t.start(); t.join();

    為什么要用join()方法

    在很多情況下,主線程生成并起動了子線程,如果子線程里要進行大量的耗時的運算,主線程往往將于子線程之前結(jié)束,但是如果主線程處理完其他的事務(wù)后,需要用到子線程的處理結(jié)果,也就是主線程需要等待子線程執(zhí)行完成之后再結(jié)束,這個時候就要用到j(luò)oin()方法了。

    不加join。
    /***@functon 多線程學(xué)習(xí),join*@author 林炳文*@time 2015.3.9*/ package com.multithread.join; class Thread1 extends Thread{private String name;public Thread1(String name) {super(name);this.name=name;}public void run() {System.out.println(Thread.currentThread().getName() + " 線程運行開始!");for (int i = 0; i < 5; i++) {System.out.println("子線程"+name + "運行 : " + i);try {sleep((int) Math.random() * 10);} catch (InterruptedException e) {e.printStackTrace();}}System.out.println(Thread.currentThread().getName() + " 線程運行結(jié)束!");} }public class Main {public static void main(String[] args) {System.out.println(Thread.currentThread().getName()+"主線程運行開始!");Thread1 mTh1=new Thread1("A");Thread1 mTh2=new Thread1("B");mTh1.start();mTh2.start();System.out.println(Thread.currentThread().getName()+ "主線程運行結(jié)束!");}} 輸出結(jié)果:
    main主線程運行開始!
    main主線程運行結(jié)束!
    B 線程運行開始!
    子線程B運行 : 0
    A 線程運行開始!
    子線程A運行 : 0
    子線程B運行 : 1
    子線程A運行 : 1
    子線程A運行 : 2
    子線程A運行 : 3
    子線程A運行 : 4
    A 線程運行結(jié)束!
    子線程B運行 : 2
    子線程B運行 : 3
    子線程B運行 : 4
    B 線程運行結(jié)束!
    發(fā)現(xiàn)主線程比子線程早結(jié)束

    加join
    public class Main {public static void main(String[] args) {System.out.println(Thread.currentThread().getName()+"主線程運行開始!");Thread1 mTh1=new Thread1("A");Thread1 mTh2=new Thread1("B");mTh1.start();mTh2.start();try {mTh1.join();} catch (InterruptedException e) {e.printStackTrace();}try {mTh2.join();} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName()+ "主線程運行結(jié)束!");}}
    運行結(jié)果:
    main主線程運行開始!
    A 線程運行開始!
    子線程A運行 : 0
    B 線程運行開始!
    子線程B運行 : 0
    子線程A運行 : 1
    子線程B運行 : 1
    子線程A運行 : 2
    子線程B運行 : 2
    子線程A運行 : 3
    子線程B運行 : 3
    子線程A運行 : 4
    子線程B運行 : 4
    A 線程運行結(jié)束!
    主線程一定會等子線程都結(jié)束了才結(jié)束

    ③yield():暫停當前正在執(zhí)行的線程對象,并執(zhí)行其他線程。
    Thread.yield()方法作用是:暫停當前正在執(zhí)行的線程對象,并執(zhí)行其他線程。 yield()應(yīng)該做的是讓當前運行線程回到可運行狀態(tài),以允許具有相同優(yōu)先級的其他線程獲得運行機會。因此,使用yield()的目的是讓相同優(yōu)先級的線程之間能適當?shù)妮嗈D(zhuǎn)執(zhí)行。但是,實際中無法保證yield()達到讓步目的,因為讓步的線程還有可能被線程調(diào)度程序再次選中。 結(jié)論:yield()從未導(dǎo)致線程轉(zhuǎn)到等待/睡眠/阻塞狀態(tài)。在大多數(shù)情況下,yield()將導(dǎo)致線程從運行狀態(tài)轉(zhuǎn)到可運行狀態(tài),但有可能沒有效果。可看上面的圖。
    /***@functon 多線程學(xué)習(xí) yield*@author 林炳文*@time 2015.3.9*/ package com.multithread.yield; class ThreadYield extends Thread{public ThreadYield(String name) {super(name);}@Overridepublic void run() {for (int i = 1; i <= 50; i++) {System.out.println("" + this.getName() + "-----" + i);// 當i為30時,該線程就會把CPU時間讓掉,讓其他或者自己的線程執(zhí)行(也就是誰先搶到誰執(zhí)行)if (i ==30) {this.yield();}}} }public class Main {public static void main(String[] args) {ThreadYield yt1 = new ThreadYield("張三");ThreadYield yt2 = new ThreadYield("李四");yt1.start();yt2.start();}}
    運行結(jié)果:

    第一種情況:李四(線程)當執(zhí)行到30時會CPU時間讓掉,這時張三(線程)搶到CPU時間并執(zhí)行。

    第二種情況:李四(線程)當執(zhí)行到30時會CPU時間讓掉,這時李四(線程)搶到CPU時間并執(zhí)行。

    sleep()和yield()的區(qū)別
    ??????? sleep()和yield()的區(qū)別):sleep()使當前線程進入停滯狀態(tài),所以執(zhí)行sleep()的線程在指定的時間內(nèi)肯定不會被執(zhí)行;yield()只是使當前線程重新回到可執(zhí)行狀態(tài),所以執(zhí)行yield()的線程有可能在進入到可執(zhí)行狀態(tài)后馬上又被執(zhí)行。
    ??????? sleep?方法使當前運行中的線程睡眼一段時間,進入不可運行狀態(tài),這段時間的長短是由程序設(shè)定的,yield?方法使當前線程讓出?CPU?占有權(quán),但讓出的時間是不可設(shè)定的。實際上,yield()方法對應(yīng)了如下操作:先檢測當前是否有相同優(yōu)先級的線程處于同可運行狀態(tài),如有,則把?CPU??的占有權(quán)交給此線程,否則,繼續(xù)運行原來的線程。所以yield()方法稱為“退讓”,它把運行機會讓給了同等優(yōu)先級的其他線程
    ?????? 另外,sleep?方法允許較低優(yōu)先級的線程獲得運行機會,但?yield()??方法執(zhí)行時,當前線程仍處在可運行狀態(tài),所以,不可能讓出較低優(yōu)先級的線程些時獲得?CPU?占有權(quán)。在一個運行系統(tǒng)中,如果較高優(yōu)先級的線程沒有調(diào)用?sleep?方法,又沒有受到?I\O?阻塞,那么,較低優(yōu)先級線程只能等待所有較高優(yōu)先級的線程運行結(jié)束,才有機會運行。

    ④setPriority():?更改線程的優(yōu)先級。

        MIN_PRIORITY = 1
    ?   ???NORM_PRIORITY = 5
    ????????? ?MAX_PRIORITY = 10

    用法:
    Thread4 t1 = new Thread4("t1"); Thread4 t2 = new Thread4("t2"); t1.setPriority(Thread.MAX_PRIORITY); t2.setPriority(Thread.MIN_PRIORITY);
    ⑤interrupt():中斷某個線程,這種結(jié)束方式比較粗暴,如果t線程打開了某個資源還沒來得及關(guān)閉也就是run方法還沒有執(zhí)行完就強制結(jié)束線程,會導(dǎo)致資源無法關(guān)閉

      要想結(jié)束進程最好的辦法就是用sleep()函數(shù)的例子程序里那樣,在線程類里面用以個boolean型變量來控制run()方法什么時候結(jié)束,run()方法一結(jié)束,該線程也就結(jié)束了。

    ⑥wait()

    Obj.wait(),與Obj.notify()必須要與synchronized(Obj)一起使用,也就是wait,與notify是針對已經(jīng)獲取了Obj鎖進行操作,從語法角度來說就是Obj.wait(),Obj.notify必須在synchronized(Obj){...}語句塊內(nèi)。從功能上來說wait就是說線程在獲取對象鎖后,主動釋放對象鎖,同時本線程休眠。直到有其它線程調(diào)用對象的notify()喚醒該線程,才能繼續(xù)獲取對象鎖,并繼續(xù)執(zhí)行。相應(yīng)的notify()就是對對象鎖的喚醒操作。但有一點需要注意的是notify()調(diào)用后,并不是馬上就釋放對象鎖的,而是在相應(yīng)的synchronized(){}語句塊執(zhí)行結(jié)束,自動釋放鎖后,JVM會在wait()對象鎖的線程中隨機選取一線程,賦予其對象鎖,喚醒線程,繼續(xù)執(zhí)行。這樣就提供了在線程間同步、喚醒的操作。Thread.sleep()與Object.wait()二者都可以暫停當前線程,釋放CPU控制權(quán),主要的區(qū)別在于Object.wait()在釋放CPU同時,釋放了對象鎖的控制。

    ??? 單單在概念上理解清楚了還不夠,需要在實際的例子中進行測試才能更好的理解。對Object.wait(),Object.notify()的應(yīng)用最經(jīng)典的例子,應(yīng)該是三線程打印ABC的問題了吧,這是一道比較經(jīng)典的面試題,題目要求如下:

    ??? 建立三個線程,A線程打印10次A,B線程打印10次B,C線程打印10次C,要求線程同時運行,交替打印10次ABC。這個問題用Object的wait(),notify()就可以很方便的解決。代碼如下:

    /*** wait用法* @author DreamSea * @time 2015.3.9 */ package com.multithread.wait; public class MyThreadPrinter2 implements Runnable { private String name; private Object prev; private Object self; private MyThreadPrinter2(String name, Object prev, Object self) { this.name = name; this.prev = prev; this.self = self; } @Override public void run() { int count = 10; while (count > 0) { synchronized (prev) { synchronized (self) { System.out.print(name); count--; self.notify(); } try { prev.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } } public static void main(String[] args) throws Exception { Object a = new Object(); Object b = new Object(); Object c = new Object(); MyThreadPrinter2 pa = new MyThreadPrinter2("A", c, a); MyThreadPrinter2 pb = new MyThreadPrinter2("B", a, b); MyThreadPrinter2 pc = new MyThreadPrinter2("C", b, c); new Thread(pa).start();Thread.sleep(100); //確保按順序A、B、C執(zhí)行new Thread(pb).start();Thread.sleep(100); new Thread(pc).start(); Thread.sleep(100); } }
    輸出結(jié)果:

    ABCABCABCABCABCABCABCABCABCABC

    ???? 先來解釋一下其整體思路,從大的方向上來講,該問題為三線程間的同步喚醒操作,主要的目的就是ThreadA->ThreadB->ThreadC->ThreadA循環(huán)執(zhí)行三個線程。為了控制線程執(zhí)行的順序,那么就必須要確定喚醒、等待的順序,所以每一個線程必須同時持有兩個對象鎖,才能繼續(xù)執(zhí)行。一個對象鎖是prev,就是前一個線程所持有的對象鎖。還有一個就是自身對象鎖。主要的思想就是,為了控制執(zhí)行的順序,必須要先持有prev鎖,也就前一個線程要釋放自身對象鎖,再去申請自身對象鎖,兩者兼?zhèn)鋾r打印,之后首先調(diào)用self.notify()釋放自身對象鎖,喚醒下一個等待線程,再調(diào)用prev.wait()釋放prev對象鎖,終止當前線程,等待循環(huán)結(jié)束后再次被喚醒。運行上述代碼,可以發(fā)現(xiàn)三個線程循環(huán)打印ABC,共10次。程序運行的主要過程就是A線程最先運行,持有C,A對象鎖,后釋放A,C鎖,喚醒B。線程B等待A鎖,再申請B鎖,后打印B,再釋放B,A鎖,喚醒C,線程C等待B鎖,再申請C鎖,后打印C,再釋放C,B鎖,喚醒A。看起來似乎沒什么問題,但如果你仔細想一下,就會發(fā)現(xiàn)有問題,就是初始條件,三個線程按照A,B,C的順序來啟動,按照前面的思考,A喚醒B,B喚醒C,C再喚醒A。但是這種假設(shè)依賴于JVM中線程調(diào)度、執(zhí)行的順序。
    ??? wait和sleep區(qū)別
    共同點:

    1. 他們都是在多線程的環(huán)境下,都可以在程序的調(diào)用處阻塞指定的毫秒數(shù),并返回。
    2. wait()和sleep()都可以通過interrupt()方法 打斷線程的暫停狀態(tài) ,從而使線程立刻拋出InterruptedException。
    ?? 如果線程A希望立即結(jié)束線程B,則可以對線程B對應(yīng)的Thread實例調(diào)用interrupt方法。如果此刻線程B正在wait/sleep /join,則線程B會立刻拋出InterruptedException,在catch() {} 中直接return即可安全地結(jié)束線程。
    ?? 需要注意的是,InterruptedException是線程自己從內(nèi)部拋出的,并不是interrupt()方法拋出的。對某一線程調(diào)用 interrupt()時,如果該線程正在執(zhí)行普通的代碼,那么該線程根本就不會拋出InterruptedException。但是,一旦該線程進入到 wait()/sleep()/join()后,就會立刻拋出InterruptedException 。
    不同點:
    1. Thread類的方法:sleep(),yield()等
    ?? Object的方法:wait()和notify()等
    2. 每個對象都有一個鎖來控制同步訪問。Synchronized關(guān)鍵字可以和對象的鎖交互,來實現(xiàn)線程的同步。
    ?? sleep方法沒有釋放鎖,而wait方法釋放了鎖,使得其他線程可以使用同步控制塊或者方法。
    3. wait,notify和notifyAll只能在同步控制方法或者同步控制塊里面使用,而sleep可以在任何地方使用
    4. sleep必須捕獲異常,而wait,notify和notifyAll不需要捕獲異常
    所以sleep()和wait()方法的最大區(qū)別是:
        sleep()睡眠時,保持對象鎖,仍然占有該鎖;
        而wait()睡眠時,釋放對象鎖。
      但是wait()和sleep()都可以通過interrupt()方法打斷線程的暫停狀態(tài),從而使線程立刻拋出InterruptedException(但不建議使用該方法)。
    sleep()方法
    sleep()使當前線程進入停滯狀態(tài)(阻塞當前線程),讓出CUP的使用、目的是不讓當前線程獨自霸占該進程所獲的CPU資源,以留一定時間給其他線程執(zhí)行的機會;
       sleep()是Thread類的Static(靜態(tài))的方法;因此他不能改變對象的機鎖,所以當在一個Synchronized塊中調(diào)用Sleep()方法是,線程雖然休眠了,但是對象的機鎖并木有被釋放,其他線程無法訪問這個對象(即使睡著也持有對象鎖)。
      在sleep()休眠時間期滿后,該線程不一定會立即執(zhí)行,這是因為其它線程可能正在運行而且沒有被調(diào)度為放棄執(zhí)行,除非此線程具有更高的優(yōu)先級。
    wait()方法
    wait()方法是Object類里的方法;當一個線程執(zhí)行到wait()方法時,它就進入到一個和該對象相關(guān)的等待池中,同時失去(釋放)了對象的機鎖(暫時失去機鎖,wait(long timeout)超時時間到后還需要返還對象鎖);其他線程可以訪問;
      wait()使用notify或者notifyAlll或者指定睡眠時間來喚醒當前等待池中的線程。
      wiat()必須放在synchronized block中,否則會在program runtime時扔出”java.lang.IllegalMonitorStateException“異常。

    七、常見線程名詞解釋

    主線程:JVM調(diào)用程序main()所產(chǎn)生的線程。 當前線程:這個是容易混淆的概念。一般指通過Thread.currentThread()來獲取的進程。 后臺線程:指為其他線程提供服務(wù)的線程,也稱為守護線程。JVM的垃圾回收線程就是一個后臺線程。用戶線程和守護線程的區(qū)別在于,是否等待主線程依賴于主線程結(jié)束而結(jié)束 前臺線程:是指接受后臺線程服務(wù)的線程,其實前臺后臺線程是聯(lián)系在一起,就像傀儡和幕后操縱者一樣的關(guān)系。傀儡是前臺線程、幕后操縱者是后臺線程。由前臺線程創(chuàng)建的線程默認也是前臺線程。可以通過isDaemon()和setDaemon()方法來判斷和設(shè)置一個線程是否為后臺線程。

    線程類的一些常用方法:?

      sleep(): 強迫一個線程睡眠N毫秒。?
      isAlive(): 判斷一個線程是否存活。?
      join(): 等待線程終止。?
      activeCount(): 程序中活躍的線程數(shù)。?
      enumerate(): 枚舉程序中的線程。?
    ??? currentThread(): 得到當前線程。?
      isDaemon(): 一個線程是否為守護線程。?
      setDaemon(): 設(shè)置一個線程為守護線程。(用戶線程和守護線程的區(qū)別在于,是否等待主線程依賴于主線程結(jié)束而結(jié)束)?
      setName(): 為線程設(shè)置一個名稱。?
      wait(): 強迫一個線程等待。?
      notify(): 通知一個線程繼續(xù)運行。?
      setPriority(): 設(shè)置一個線程的優(yōu)先級。

    八、線程同步

    1、synchronized關(guān)鍵字的作用域有二種:
    1)是某個對象實例內(nèi),synchronized aMethod(){}可以防止多個線程同時訪問這個對象的synchronized方法(如果一個對象有多個synchronized方法,只要一個線程訪問了其中的一個synchronized方法,其它線程不能同時訪問這個對象中任何一個synchronized方法)。這時,不同的對象實例的synchronized方法是不相干擾的。也就是說,其它線程照樣可以同時訪問相同類的另一個對象實例中的synchronized方法;
    2)是某個類的范圍,synchronized static aStaticMethod{}防止多個線程同時訪問這個類中的synchronized static 方法。它可以對類的所有對象實例起作用。

    2、除了方法前用synchronized關(guān)鍵字,synchronized關(guān)鍵字還可以用于方法中的某個區(qū)塊中,表示只對這個區(qū)塊的資源實行互斥訪問。用法是: synchronized(this){/*區(qū)塊*/},它的作用域是當前對象;

    3、synchronized關(guān)鍵字是不能繼承的,也就是說,基類的方法synchronized f(){} 在繼承類中并不自動是synchronized f(){},而是變成了f(){}。繼承類需要你顯式的指定它的某個方法為synchronized方法;

    Java對多線程的支持與同步機制深受大家的喜愛,似乎看起來使用了synchronized關(guān)鍵字就可以輕松地解決多線程共享數(shù)據(jù)同步問題。到底如何?――還得對synchronized關(guān)鍵字的作用進行深入了解才可定論。

    總的說來,synchronized關(guān)鍵字可以作為函數(shù)的修飾符,也可作為函數(shù)內(nèi)的語句,也就是平時說的同步方法和同步語句塊。如果再細的分類,synchronized可作用于instance變量、object reference(對象引用)、static函數(shù)和class literals(類名稱字面常量)身上。

    在進一步闡述之前,我們需要明確幾點:

    A.無論synchronized關(guān)鍵字加在方法上還是對象上,它取得的鎖都是對象,而不是把一段代碼或函數(shù)當作鎖――而且同步方法很可能還會被其他線程的對象訪問。

    B.每個對象只有一個鎖(lock)與之相關(guān)聯(lián)。

    C.實現(xiàn)同步是要很大的系統(tǒng)開銷作為代價的,甚至可能造成死鎖,所以盡量避免無謂的同步控制。

    接著來討論synchronized用到不同地方對代碼產(chǎn)生的影響:

    ?

    假設(shè)P1、P2是同一個類的不同對象,這個類中定義了以下幾種情況的同步塊或同步方法,P1、P2就都可以調(diào)用它們。

    ?

    1.? 把synchronized當作函數(shù)修飾符時,示例代碼如下:

    Public synchronized void methodAAA()

    {

    //….

    }

    這也就是同步方法,那這時synchronized鎖定的是哪個對象呢?它鎖定的是調(diào)用這個同步方法對象。也就是說,當一個對象P1在不同的線程中執(zhí)行這個同步方法時,它們之間會形成互斥,達到同步的效果。但是這個對象所屬的Class所產(chǎn)生的另一對象P2卻可以任意調(diào)用這個被加了synchronized關(guān)鍵字的方法。

    上邊的示例代碼等同于如下代碼:

    public void methodAAA()

    {

    synchronized (this)????? //? (1)

    {

    ?????? //…..

    }

    }

    ?(1)處的this指的是什么呢?它指的就是調(diào)用這個方法的對象,如P1。可見同步方法實質(zhì)是將synchronized作用于object reference。――那個拿到了P1對象鎖的線程,才可以調(diào)用P1的同步方法,而對P2而言,P1這個鎖與它毫不相干,程序也可能在這種情形下擺脫同步機制的控制,造成數(shù)據(jù)混亂:(

    2.同步塊,示例代碼如下:

    ??????????? public void method3(SomeObject so)

    ????????????? {

    ???????????????????? synchronized(so)

    {

    ?????? //…..

    }

    }

    這時,鎖就是so這個對象,誰拿到這個鎖誰就可以運行它所控制的那段代碼。當有一個明確的對象作為鎖時,就可以這樣寫程序,但當沒有明確的對象作為鎖,只是想讓一段代碼同步時,可以創(chuàng)建一個特殊的instance變量(它得是一個對象)來充當鎖:

    class Foo implements Runnable

    {

    ?????? private byte[] lock = new byte[0];? // 特殊的instance變量

    ??? Public void methodA()

    {

    ?????? synchronized(lock) { //… }

    }

    //…..

    }

    注:零長度的byte數(shù)組對象創(chuàng)建起來將比任何對象都經(jīng)濟――查看編譯后的字節(jié)碼:生成零長度的byte[]對象只需3條操作碼,而Object lock = new Object()則需要7行操作碼。

    3.將synchronized作用于static 函數(shù),示例代碼如下:

    ????? Class Foo

    {

    public synchronized static void methodAAA()?? // 同步的static 函數(shù)

    {

    //….

    }

    public void methodBBB()

    {

    ?????? synchronized(Foo.class)?? //? class literal(類名稱字面常量)

    }

    ?????? }

    ?? 代碼中的methodBBB()方法是把class literal作為鎖的情況,它和同步的static函數(shù)產(chǎn)生的效果是一樣的,取得的鎖很特別,是當前調(diào)用這個方法的對象所屬的類(Class,而不再是由這個Class產(chǎn)生的某個具體對象了)。

    記得在《Effective Java》一書中看到過將 Foo.class和 P1.getClass()用于作同步鎖還不一樣,不能用P1.getClass()來達到鎖這個Class的目的。P1指的是由Foo類產(chǎn)生的對象。

    可以推斷:如果一個類中定義了一個synchronized的static函數(shù)A,也定義了一個synchronized 的instance函數(shù)B,那么這個類的同一對象Obj在多線程中分別訪問A和B兩個方法時,不會構(gòu)成同步,因為它們的鎖都不一樣。A方法的鎖是Obj這個對象,而B的鎖是Obj所屬的那個Class。

    ?

    1、線程同步的目的是為了保護多個線程反問一個資源時對資源的破壞。 2、線程同步方法是通過鎖來實現(xiàn),每個對象都有切僅有一個鎖,這個鎖與一個特定的對象關(guān)聯(lián),線程一旦獲取了對象鎖,其他訪問該對象的線程就無法再訪問該對象的其他非同步方法。 3、對于靜態(tài)同步方法,鎖是針對這個類的,鎖對象是該類的Class對象。靜態(tài)和非靜態(tài)方法的鎖互不干預(yù)。一個線程獲得鎖,當在一個同步方法中訪問另外對象上的同步方法時,會獲取這兩個對象鎖。 4、對于同步,要時刻清醒在哪個對象上同步,這是關(guān)鍵。 5、編寫線程安全的類,需要時刻注意對多個線程競爭訪問資源的邏輯和安全做出正確的判斷,對“原子”操作做出分析,并保證原子操作期間別的線程無法訪問競爭資源。 6、當多個線程等待一個對象鎖時,沒有獲取到鎖的線程將發(fā)生阻塞。 7、死鎖是線程間相互等待鎖鎖造成的,在實際中發(fā)生的概率非常的小。真讓你寫個死鎖程序,不一定好使,呵呵。但是,一旦程序發(fā)生死鎖,程序?qū)⑺赖簟?

    ?

    九、線程數(shù)據(jù)傳遞

    在傳統(tǒng)的同步開發(fā)模式下,當我們調(diào)用一個函數(shù)時,通過這個函數(shù)的參數(shù)將數(shù)據(jù)傳入,并通過這個函數(shù)的返回值來返回最終的計算結(jié)果。但在多線程的異步開發(fā)模式下,數(shù)據(jù)的傳遞和返回和同步開發(fā)模式有很大的區(qū)別。由于線程的運行和結(jié)束是不可預(yù)料的,因此,在傳遞和返回數(shù)據(jù)時就無法象函數(shù)一樣通過函數(shù)參數(shù)和return語句來返回數(shù)據(jù)。

    9.1、通過構(gòu)造方法傳遞數(shù)據(jù)?
    在創(chuàng)建線程時,必須要建立一個Thread類的或其子類的實例。因此,我們不難想到在調(diào)用start方法之前通過線程類的構(gòu)造方法將數(shù)據(jù)傳入線程。并將傳入的數(shù)據(jù)使用類變量保存起來,以便線程使用(其實就是在run方法中使用)。下面的代碼演示了如何通過構(gòu)造方法來傳遞數(shù)據(jù):?

    package mythread; public class MyThread1 extends Thread { private String name; public MyThread1(String name) { this.name = name; } public void run() { System.out.println("hello " + name); } public static void main(String[] args) { Thread thread = new MyThread1("world"); thread.start(); } }

    由于這種方法是在創(chuàng)建線程對象的同時傳遞數(shù)據(jù)的,因此,在線程運行之前這些數(shù)據(jù)就就已經(jīng)到位了,這樣就不會造成數(shù)據(jù)在線程運行后才傳入的現(xiàn)象。如果要傳遞更復(fù)雜的數(shù)據(jù),可以使用集合、類等數(shù)據(jù)結(jié)構(gòu)。使用構(gòu)造方法來傳遞數(shù)據(jù)雖然比較安全,但如果要傳遞的數(shù)據(jù)比較多時,就會造成很多不便。由于Java沒有默認參數(shù),要想實現(xiàn)類似默認參數(shù)的效果,就得使用重載,這樣不但使構(gòu)造方法本身過于復(fù)雜,又會使構(gòu)造方法在數(shù)量上大增。因此,要想避免這種情況,就得通過類方法或類變量來傳遞數(shù)據(jù)。?

    9.2、通過變量和方法傳遞數(shù)據(jù)?
    向?qū)ο笾袀魅霐?shù)據(jù)一般有兩次機會,第一次機會是在建立對象時通過構(gòu)造方法將數(shù)據(jù)傳入,另外一次機會就是在類中定義一系列的public的方法或變量(也可稱之為字段)。然后在建立完對象后,通過對象實例逐個賦值。下面的代碼是對MyThread1類的改版,使用了一個setName方法來設(shè)置 name變量:?

    ?

    package mythread; public class MyThread2 implements Runnable { private String name; public void setName(String name) { this.name = name; } public void run() { System.out.println("hello " + name); } public static void main(String[] args) { MyThread2 myThread = new MyThread2(); myThread.setName("world"); Thread thread = new Thread(myThread); thread.start(); } }

    9.3、通過回調(diào)函數(shù)傳遞數(shù)據(jù)?

    上面討論的兩種向線程中傳遞數(shù)據(jù)的方法是最常用的。但這兩種方法都是main方法中主動將數(shù)據(jù)傳入線程類的。這對于線程來說,是被動接收這些數(shù)據(jù)的。然而,在有些應(yīng)用中需要在線程運行的過程中動態(tài)地獲取數(shù)據(jù),如在下面代碼的run方法中產(chǎn)生了3個隨機數(shù),然后通過Work類的process方法求這三個隨機數(shù)的和,并通過Data類的value將結(jié)果返回。從這個例子可以看出,在返回value之前,必須要得到三個隨機數(shù)。也就是說,這個 value是無法事先就傳入線程類的。?

    ?

    package mythread; class Data { public int value = 0; } class Work { public void process(Data data, Integer numbers) { for (int n : numbers) { data.value += n; } } } public class MyThread3 extends Thread { private Work work; public MyThread3(Work work) { this.work = work; } public void run() { java.util.Random random = new java.util.Random(); Data data = new Data(); int n1 = random.nextInt(1000); int n2 = random.nextInt(2000); int n3 = random.nextInt(3000); work.process(data, n1, n2, n3); // 使用回調(diào)函數(shù) System.out.println(String.valueOf(n1) + "+" + String.valueOf(n2) + "+" + String.valueOf(n3) + "=" + data.value); } public static void main(String[] args) { Thread thread = new MyThread3(new Work()); thread.start(); } }

    原創(chuàng)文章

    總結(jié)

    以上是生活随笔為你收集整理的Java多线程超详细总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

    亚洲天堂网站视频 | 在线观看中文字幕网站 | 日韩欧美国产成人 | 久艹在线观看视频 | 国产中文欧美日韩在线 | 精品国产中文字幕 | 玖玖精品视频 | 五月激情五月激情 | 成人精品电影 | 亚洲最大色 | 久久久国产精品视频 | 国产精品美女视频网站 | 成人高清在线观看 | 国产黄视频在线观看 | 在线视频日韩一区 | 不卡中文字幕av | 日韩欧美精品一区 | 久久99久久99免费视频 | 免费网站色| 日本久久久亚洲精品 | 超碰人人舔 | 亚洲精品在线观看视频 | 黄色大全免费网站 | 97视频在线免费 | 免费在线观看一区二区三区 | 亚洲精品啊啊啊 | 国产丝袜一区二区三区 | www.狠狠操| 日本中文字幕久久 | 亚洲毛片一区二区三区 | 午夜国产福利视频 | 九九九热精品免费视频观看 | 精品久久免费 | 久草视频在线免费 | 一区二区三区在线电影 | 精品国产乱码久久久久久浪潮 | 久草视频看看 | 狠狠色狠狠色综合系列 | 国产精品一区二区久久久 | 黄色av一区 | 精品麻豆入口免费 | 天天爱天天射天天干天天 | 91成版人在线观看入口 | 久久人人爽人人爽人人片 | 一本大道久久精品懂色aⅴ 五月婷社区 | 欧美激情综合五月 | 亚洲午夜精品一区 | 欧美日韩午夜在线 | 国产一卡二卡四卡国 | 天天干,夜夜爽 | 久久久久国产精品免费网站 | 欧美日韩性视频在线 | 91久久精品一区二区二区 | 午夜精品久久久久 | 青青草视频精品 | 日产中文字幕 | 婷婷深爱五月 | 97视频在线观看成人 | 91麻豆产精品久久久久久 | a在线v| 成人av在线影视 | 亚洲精品色 | 午夜精品久久久久久久99热影院 | 国产精品成人一区二区三区 | 伊人久久五月天 | 日韩aⅴ视频 | 91资源在线免费观看 | 福利网在线 | av网址aaa | 日本乱视频 | 伊人狠狠色丁香婷婷综合 | 丁香色婷婷 | 五月天亚洲综合小说网 | 超级碰99 | 91精品啪啪| 色综合天天狠天天透天天伊人 | 五月婷婷在线视频观看 | 免费视频你懂得 | 国产成人av一区二区三区在线观看 | 制服丝袜一区二区 | 天天操欧美 | 国产91亚洲 | 国产成人1区 | 久久精品久久久久电影 | 久久视频这里有久久精品视频11 | 中文字幕在线观看免费 | 99热在线精品观看 | 91经典在线 | 亚洲精品自在在线观看 | 久久高清免费 | 久草在线免费电影 | 人人舔人人干 | 日本公乱妇视频 | 色视频网站在线观看一=区 a视频免费在线观看 | 国产美女视频免费观看的网站 | 亚洲成人精品国产 | 九九久久婷婷 | 女人18精品一区二区三区 | 亚洲二区精品 | 欧美另类一二三四区 | 婷婷伊人综合 | 在线综合 亚洲 欧美在线视频 | 日韩av影视在线 | 亚洲精选在线观看 | 最新中文字幕在线资源 | 亚洲日本va在线观看 | 91免费看黄 | 人人添人人澡人人澡人人人爽 | 99热手机在线 | 久久久久国产一区二区三区四区 | 97超碰在线人人 | 色老板在线| 激情黄色一级片 | 啪啪资源 | 久久久精品国产免费观看同学 | 五月开心激情网 | 国产手机视频精品 | 久草在线免费新视频 | 天天插天天狠天天透 | 在线91av| 日韩欧美国产激情在线播放 | av黄色免费在线观看 | 欧美日韩高清在线观看 | 久久综合九色综合97_ 久久久 | 久久国产精品区 | 色天天综合网 | 国产午夜精品视频 | 深爱开心激情 | 国产免费不卡 | 国产精品视频最多的网站 | 久久国产高清视频 | 免费av 在线 | 日韩成人在线一区二区 | www.午夜视频 | 黄色av观看 | 欧美最爽乱淫视频播放 | 国产在线理论片 | 国产小视频在线免费观看视频 | 成人毛片一区 | av免费在线播放 | 免费看的黄色片 | 伊人在线视频 | 国内丰满少妇猛烈精品播放 | 精品免费视频123区 午夜久久成人 | 国产精品国产三级国产aⅴ入口 | 天天色棕合合合合合合 | 成人久久久久久久久 | 超碰在线人人97 | 91精品少妇偷拍99 | 亚洲激情在线视频 | 天天舔夜夜操 | 国产精品成人一区二区三区吃奶 | 欧美在一区| av手机在线播放 | 在线中文日韩 | av在线免费观看不卡 | 色吧av色av | 欧美成人性网 | 国产福利91精品一区二区三区 | 久草视频在线免费看 | 国产精品欧美激情在线观看 | 日产乱码一二三区别在线 | 狠狠干夜夜爱 | 久久久久久久久久久精 | 色婷婷导航 | 在线国产视频一区 | 香蕉网在线观看 | 午夜视频免费播放 | 国产精品美女久久久久久免费 | www.五月婷| 国产毛片aaa | 狠狠色丁香婷婷综合视频 | 黄色三级免费网址 | 国产不卡免费视频 | 伊人久久五月天 | 五月婷婷丁香在线观看 | 麻豆视频一区 | 手机看片国产日韩 | 国产资源在线免费观看 | 久久精品一区二区三区中文字幕 | 免费久久99精品国产 | 97精品国产91久久久久久久 | 黄色综合 | 91麻豆精品国产91久久久无需广告 | 二区精品视频 | 久久精品一区二区三 | 国产精品一区二区三区观看 | 日韩欧美久久 | 三级av在线免费观看 | 精品久久久影院 | 亚洲精品高清一区二区三区四区 | 免费a v视频 | 特级毛片网 | 国产精品 999 | zzijzzij亚洲日本少妇熟睡 | 91一区二区三区在线观看 | 91桃花视频 | 日本h视频在线观看 | 欧美日韩一区二区在线 | 免费韩国av | 91久色蝌蚪 | 国产一级片播放 | 亚洲黄色激情小说 | 亚洲专区免费观看 | 久久网址 | jizzjizzjizz亚洲 | 在线看日韩av | 亚洲国产精品视频在线观看 | 久久精品国产成人精品 | 在线视频观看你懂的 | 96视频在线 | 久久精品1区2区 | 免费在线观看黄 | 国产精品嫩草69影院 | av成人在线网站 | 国产福利专区 | 国产精品精品久久久久久 | 六月丁香色婷婷 | 精品福利av | 亚洲 欧美 变态 国产 另类 | 久久精品欧美一区 | 成人黄色在线 | 高潮久久久久久久久 | 国产青春久久久国产毛片 | 成年人在线免费看视频 | 国产一级做a | 日韩欧美精品免费 | 最近中文国产在线视频 | 久久精品国产成人 | 天天射天天操天天干 | av免费在线观看1 | 在线视频1卡二卡三卡 | 美州a亚洲一视本频v色道 | 中文字幕在线高清 | 99热这里只有精品1 av中文字幕日韩 | 欧美色图一区 | 日本精品视频在线观看 | www.激情五月.com | 亚洲视频在线视频 | 亚洲午夜av电影 | 亚洲成熟女人毛片在线 | 欧美色综合天天久久综合精品 | 久草精品在线观看 | 成年人在线看视频 | 天天艹 | 亚洲人在线7777777精品 | 99久久夜色精品国产亚洲 | 国产综合精品一区二区三区 | av黄在线播放 | 国产成人在线免费观看 | 国产精品久久久久久久久久久免费 | 亚洲伦理一区 | 国产小视频在线免费观看 | 免费在线观看一区 | 久久久久久久电影 | 日本精品久久久久中文字幕5 | 狠狠干夜夜爱 | 国产精品毛片一区二区在线看 | 免费麻豆 | 天天超碰 | 成人毛片一区二区三区 | 爱av在线网| 特黄免费av | 午夜视频福利 | 亚洲激情网站免费观看 | 久草在线视频新 | 国产视频在线观看一区 | 欧美精品久久久久久久久久 | 亚洲综合激情网 | 中文字幕日韩在线播放 | 国产在线永久 | 深夜国产在线 | 韩国一区二区av | 国产精品久久久久久久久久ktv | 国产精品6 | 欧美午夜理伦三级在线观看 | 欧美视频在线观看免费网址 | 97在线免费视频 | av一区二区三区在线播放 | 四虎永久国产精品 | 99爱国产精品 | 99久久国产免费,99久久国产免费大片 | 黄色精品视频 | 欧美精彩视频在线观看 | 国产一区二区不卡视频 | 91mv.cool在线观看 | 国产精品国产自产拍高清av | 激情小说网站亚洲综合网 | 国产成人av电影在线 | 天天操天天插 | 成人国产一区 | 色瓜| 久草精品视频 | a久久久久久 | 人人爱人人做人人爽 | 亚洲精品视频在线观看免费视频 | 一区二区三区免费在线观看视频 | 国产热re99久久6国产精品 | 午夜视频在线观看一区二区三区 | 国产成人福利在线观看 | 国语自产偷拍精品视频偷 | 亚洲va欧美va人人爽春色影视 | 亚洲成av人影院 | 日韩在线视频免费观看 | 日本中文字幕在线播放 | 日韩欧美综合在线视频 | 欧美日韩中文在线观看 | 久久男人中文字幕资源站 | 中文字幕在线播放视频 | 成人在线超碰 | 免费试看一区 | 久久黄色a级片 | 视频一区二区免费 | 欧美日韩一区二区三区不卡 | 成人在线播放网站 | 国产不卡在线观看视频 | 国产精品久久久电影 | 欧美国产日韩激情 | 中文字幕乱码电影 | 国产精品毛片久久久久久 | 久久精品国产精品亚洲 | 99国产成+人+综合+亚洲 欧美 | 黄色小视频在线观看免费 | 成年人app网址 | 西西444www大胆无视频 | 99精品在线免费观看 | 亚洲97在线 | 精品国产乱码久久久久久浪潮 | 在线观看国产一区 | 久久久久久久久久久久亚洲 | 国精产品永久999 | av电影在线不卡 | 色婷婷啪啪免费在线电影观看 | 高清免费在线视频 | 国产男女免费完整视频 | 成人一区二区三区在线 | 中文字幕免费观看全部电影 | 五月婷婷在线观看 | 国产 成人 久久 | 草莓视频在线观看免费观看 | 在线免费黄网站 | 91资源在线 | 精品一区二区在线观看 | av网址aaa| 天天操天天干天天玩 | 精品久操| 亚洲,国产成人av | av亚洲产国偷v产偷v自拍小说 | 日韩一区二区三区高清免费看看 | 丁香六月在线 | 国产麻豆电影在线观看 | 四虎国产精品免费观看视频优播 | 日韩成人精品一区二区 | 西西444www大胆高清视频 | 欧美日产在线观看 | 国产亚洲精品日韩在线tv黄 | 国产精品中文字幕在线播放 | 开心激情综合网 | 色综合久久久久综合体桃花网 | 婷婷六月色 | 日韩久久在线 | 日韩激情中文字幕 | 日韩精品综合在线 | 国产黄色一级片在线 | 在线视频国产区 | 日韩av成人在线 | 久久视频一区 | 国产精品久久久久aaaa九色 | 免费h精品视频在线播放 | 亚洲国产字幕 | 久久久一本精品99久久精品 | 国产视频在线观看一区 | 成人性生爱a∨ | avove黑丝| 亚洲国产色一区 | 九九免费精品视频在线观看 | www.夜夜爱| 欧美日韩免费一区二区三区 | 日韩高清一区在线 | 日本爱爱片 | 午夜美女福利直播 | 久久免费国产视频 | 婷婷在线观看视频 | 国产一级做a爱片久久毛片a | 国产成人精品av久久 | 在线a亚洲视频播放在线观看 | 日韩艹 | 福利视频一二区 | 亚洲精品在线国产 | 韩国av免费看| 日韩视频免费在线 | 国产精品久久久久久久久免费看 | 91中文字幕在线播放 | 日本激情动作片免费看 | 久久永久免费 | 69xx视频 | 久久久久久久久久久国产精品 | 久久草在线免费 | 人人插人人玩 | 久久99国产精品自在自在app | 91精品国产91 | 国产精品色婷婷视频 | 亚洲专区在线播放 | 亚洲欧美日韩国产精品一区午夜 | 精品久久久久久国产91 | 亚洲一区二区麻豆 | av成人动漫在线观看 | 天天色天天草天天射 | 久久香蕉国产精品麻豆粉嫩av | 毛片在线播放网址 | 国产99在线免费 | 精品久久久久久久 | 91网在线 | 久久久性| 特级西西444www大胆高清无视频 | 91黄视频在线观看 | 九九欧美视频 | 亚洲国产日韩一区 | 久久午夜电影院 | 日韩在线一级 | 日本黄区免费视频观看 | 亚洲成年片 | 日韩av电影国产 | 国产成人精品网站 | 免费在线观看亚洲视频 | 亚洲3级| 欧美在线视频一区二区三区 | 精品久久久久久综合日本 | www欧美日韩 | 久久超级碰 | 国产精品自产拍在线观看中文 | 国产精品乱码久久 | 国产伦精品一区二区三区高清 | 黄色影院在线免费观看 | 欧美一区中文字幕 | 在线91av| av大全在线免费观看 | 色综合久久88色综合天天 | 在线亚洲小视频 | 国产一级片不卡 | 国产一级视屏 | 丁香5月婷婷久久 | 国产高清在线永久 | 日日干网 | 综合色亚洲 | 99国产精品久久久久久久久久 | 久久er99热精品一区二区 | 黄污视频网站 | 亚洲精品影院在线观看 | 国产大片黄色 | 人人爽人人爽人人爽 | 国产午夜精品久久久久久久久久 | 中文字幕一区二区三区四区 | 美腿丝袜av| 日日骑| 久久一区91| 久久8精品 | 亚洲高清视频一区二区三区 | 久草视频视频在线播放 | 波多野结衣视频一区二区三区 | 免费观看av网站 | 狠狠狠的干 | 日本精品一区二区三区在线观看 | 日本在线观看中文字幕 | 精品一二三区视频 | 亚洲经典视频在线观看 | 日本天天色 | 97色狠狠 | 欧美激情第28页 | 久久成人国产精品一区二区 | 日本韩国精品一区二区在线观看 | 免费在线观看亚洲视频 | 91成人免费看 | 九九久久久久99精品 | 免费观看国产精品视频 | 久久综合婷婷 | 免费观看成人 | 国产精品免费大片视频 | 精品久久一区二区 | 日本公妇在线观看高清 | 国产精品亚洲精品 | 青青草久草在线 | 欧美色综合久久 | 日本中文在线播放 | 国产一区二区综合 | 国产精品毛片一区视频播不卡 | 激情视频一区二区 | 人人澡澡人人 | 97香蕉视频 | 国产又粗又猛又爽又黄的视频免费 | 97操操操 | 亚洲色综合 | 久久久免费看视频 | 日韩簧片在线观看 | 久亚洲| 久久免费一级片 | 午夜美女福利直播 | 国产精品久久久久久久99 | 日本高清xxxx | www.天天色 | 国产高清不卡一区二区三区 | 91精品国产99久久久久久红楼 | 成人动漫一区二区三区 | 欧美 日韩 性 | 婷婷综合成人 | 超碰在线9 | www.天天成人国产电影 | 二区精品视频 | 最近中文字幕完整高清 | 亚洲影音先锋 | 九九免费在线观看视频 | 中国黄色一级大片 | 亚洲最大av在线播放 | 国产精品va在线 | 精品嫩模福利一区二区蜜臀 | 九九视频一区 | 在线小视频你懂得 | 中国老女人日b | 久久视频这里只有精品 | 久久免费黄色网址 | 色婷婷成人网 | 久久久久久久久免费视频 | 91精品国| 久久久久久久久久久久99 | 日韩精品久久久 | 色婷婷 亚洲| 超碰97在线人人 | 欧美一级看片 | 国产精品久久久久久久午夜片 | 婷婷丁香激情综合 | 久久久91精品国产 | 亚洲成人一区 | 在线影院 国内精品 | 在线观看mv的中文字幕网站 | 欧美日韩精品区 | 手机色站 | 97在线超碰 | 精品一区二区三区香蕉蜜桃 | 九九热免费视频在线观看 | 一级片免费观看视频 | 免费看毛片网站 | 免费观看国产精品 | 五月婷婷六月丁香在线观看 | 国产亚洲精品久久久久久 | 亚洲最快最全在线视频 | 国产美女主播精品一区二区三区 | 中文字幕高清免费日韩视频在线 | 日韩电影一区二区在线 | 国产精品久久久久久久久久 | 欧美一级电影在线观看 | 午夜久久福利影院 | 丝袜一区在线 | 久久久久久久久福利 | 国产精品免费人成网站 | 欧美日韩在线观看一区二区三区 | 狠狠狠狠狠操 | 久久成人综合 | 国产麻豆精品一区 | 亚洲一区二区天堂 | 日韩免费三区 | 高清久久久久久 | 在线观看视频免费大全 | 超碰97网站 | 成年人视频免费在线 | 免费亚洲视频 | 久久久久日本精品一区二区三区 | 一级黄色大片 | 97成人精品 | 51精品国自产在线 | 欧美一区二区三区四区夜夜大片 | 亚洲国产操 | 成人在线视频一区 | 手机看片午夜 | 日韩一二三区不卡 | 国产精品不卡av | 久久精品美女视频网站 | av一级久久 | 在线看国产日韩 | 视频一区久久 | av7777777| 欧美一级在线看 | 中文字幕日韩精品有码视频 | 国产伦精品一区二区三区四区视频 | 久久久久久久久久久影视 | 麻花传媒mv免费观看 | 欧美日韩视频精品 | 国产精品久久9 | 色综合久久久久久中文网 | 亚洲伊人网在线观看 | 午夜99| 一区二区三区四区免费视频 | 欧美一级性生活片 | 欧美日韩免费观看一区=区三区 | 亚洲精品国产精品国 | 国产精品伦一区二区三区视频 | 日韩电影一区二区三区 | 91精品一区二区在线观看 | 亚洲精品乱码久久久久久蜜桃不爽 | 中文字幕在线观看av | 国产日韩精品久久 | 亚洲专区在线视频 | 欧美日韩不卡在线视频 | 97视频在线观看免费 | 正在播放亚洲精品 | 久久精品欧美一区 | 久久精品国产亚洲aⅴ | 黄色大片免费网站 | 国产精品色视频 | 亚洲免费在线看 | 色中色亚洲 | 国产99免费视频 | 午夜影院日本 | 久久国产免费 | 国产精品大全 | 日本女人在线观看 | 九九九热精品免费视频观看网站 | 在线观看免费成人av | 国产网站在线免费观看 | 黄av资源| 久久国产免费看 | 国产精品嫩草影院9 | 久久精品高清 | 亚洲九九九在线观看 | 精品国产乱码久久久久久1区二区 | 日韩av一区二区在线影视 | 成人久久免费 | 免费av 在线 | av中文字幕在线播放 | 伊人成人激情 | 天堂在线视频中文网 | 00av视频 | 日韩高清免费观看 | 欧美色婷 | www.狠狠操 | 久久精品国产精品亚洲 | 美女视频又黄又免费 | 人人讲下载| 天天色天天射天天综合网 | 日本高清免费中文字幕 | 国产精品一区在线观看 | 久久久久久国产一区二区三区 | 美女免费电影 | 欧美一区影院 | 久草热视频 | 500部大龄熟乱视频使用方法 | 狠狠狠色丁香综合久久天下网 | 亚洲精品中文字幕在线观看 | 在线看小早川怜子av | 99欧美视频 | 美女黄频视频大全 | 国产黄色在线观看 | av免费观看网站 | 波多野结衣视频一区二区 | 精品国产视频在线 | 久久久综合电影 | 久久成人精品视频 | 国产精品观看 | av片在线看 | 999久久国产精品免费观看网站 | 又黄又刺激视频 | 成人黄色毛片 | 国产在线观看不卡 | 欧美精品久久久久久久久老牛影院 | 日韩一区视频在线 | 欧洲视频一区 | 日本精品视频一区 | 在线看黄色的网站 | 国产在线视频一区 | 奇米影视8888在线观看大全免费 | 中文字幕免费一区二区 | 国产特级毛片aaaaaaa高清 | 亚洲天堂香蕉 | 国产一区黄色 | 精品一区二区三区在线播放 | 国产精品久免费的黄网站 | 国产男女爽爽爽免费视频 | 国产精品毛片一区视频 | 狠狠操狠狠干天天操 | 亚洲影院天堂 | 欧美精品第一 | 五月婷婷六月综合 | 久久久久久久久久久久亚洲 | 久久av高清 | 92国产精品久久久久首页 | 丁香婷婷综合色啪 | 99久久精品国产免费看不卡 | 91在线中文| 色婷婷av在线 | 久久看片网 | 国产大陆亚洲精品国产 | 丁香国产视频 | 中文字幕视频观看 | av不卡网站 | 在线观看日本韩国电影 | 久久久久成人精品亚洲国产 | 成人免费 在线播放 | 狠狠躁夜夜躁人人爽超碰97香蕉 | 天天干天天操天天操 | 日韩在线观看网站 | 国产三级久久久 | 亚洲午夜久久久久久久久电影网 | 欧美久久久一区二区三区 | 久久久午夜精品福利内容 | 国产91全国探花系列在线播放 | 三级大片网站 | 欧美一级黄色视屏 | 久久久免费毛片 | 五月天激情综合 | 伊人春色电影网 | 一区二区中文字幕在线播放 | 黄色影院在线播放 | 日本三级不卡 | 久久精品日本啪啪涩涩 | 色噜噜狠狠狠狠色综合 | 久久99在线| 丁香九月婷婷 | 日狠狠 | 欧美人体xx| 激情久久久| 久久成人午夜 | 国产乱对白刺激视频在线观看女王 | 免费无遮挡动漫网站 | 亚洲精品资源在线观看 | av手机在线播放 | 成人毛片100免费观看 | 亚洲免费国产 | 成人av日韩 | 久久久久久久久亚洲精品 | av不卡中文字幕 | 中文字幕在线免费看线人 | 黄色大全免费网站 | 久久久久久久久久久久影院 | 日韩一区二区三区高清免费看看 | 国产综合福利在线 | 九月婷婷综合网 | 精品欧美一区二区精品久久 | 00av视频 | 亚洲国产中文字幕 | 色五婷婷| 久久久久福利视频 | 久久久www免费电影网 | 久久综合色婷婷 | 一级片免费观看 | 久久综合九色综合97_ 久久久 | 青草视频在线播放 | 精品人人人人 | 狠狠干婷婷色 | 插婷婷| 中文字幕在线观看免费高清完整版 | 精品久久久久一区二区国产 | 中文字幕xxxx| 成人永久免费 | 免费av网站在线看 | 久久视频这里只有精品 | 成人欧美一区二区三区在线观看 | 国产高清av免费在线观看 | 国产黄色视 | 久久久.com | 在线观看亚洲精品 | 亚洲精品大全 | 久久久国产视频 | 狠狠躁日日躁夜夜躁av | 国产91九色视频 | 欧美成人xxx | 久久国产精品一区二区三区四区 | 日韩资源在线 | 99精品国产高清在线观看 | 久久久影片 | 久久婷婷国产色一区二区三区 | 色偷偷网站视频 | a级国产乱理论片在线观看 特级毛片在线观看 | 国产群p | 婷婷日韩| 91传媒在线播放 | 在线国产一区二区三区 | 国产成人精品一区二区三区在线观看 | 少妇性bbb搡bbb爽爽爽欧美 | 综合网中文字幕 | 日韩国产精品一区 | av天天澡天天爽天天av | 中文字幕在线看视频 | 在线播放一区二区三区 | 国产成人精品一区二区三区网站观看 | 国产明星视频三级a三级点| 九色91福利 | 久久久久久久亚洲精品 | 亚洲人精品午夜 | 91日本在线播放 | 免费的黄色av | 亚洲国产精品va在线看黑人动漫 | 天天摸日日摸人人看 | 亚洲一级片 | www.xxxx欧美| 中文字幕在线视频一区二区 | 狠色狠色综合久久 | 天天操天天射天天操 | 免费97视频 | 麻豆成人在线观看 | 狠狠干网站| 人人爽人人 | 在线观看中文字幕视频 | 亚洲综合五月 | 99在线精品视频观看 | 六月色婷| av成人动漫在线观看 | 超碰国产在线播放 | 99精品欧美一区二区 | 国产精品久久久久久久久毛片 | 亚洲精品在线播放视频 | 天天综合日| av中文字幕在线看 | www.888.av| 69欧美视频 | 免费高清在线观看电视网站 | 欧洲高潮三级做爰 | 国产精品久久久久久久毛片 | 免费网站黄 | 国内精品免费久久影院 | 午夜影视剧场 | 99久久久久久国产精品 | 国产一区二区精品久久91 | 中文字幕一区二区三区四区在线视频 | 久久成人高清视频 | 日本在线观看中文字幕无线观看 | 国产成人av电影 | 国产精品久久99综合免费观看尤物 | www色| 超碰97免费在线 | 丝袜+亚洲+另类+欧美+变态 | 国产精品久久久久久久99 | 欧美国产一区在线 | 激情网五月 | 亚洲欧美视频网站 | 在线三级播放 | 国产精品岛国久久久久久久久红粉 | www国产亚洲精品久久麻豆 | 黄色三级网站在线观看 | 亚洲午夜av久久乱码 | 久久男人中文字幕资源站 | 免费的成人av | 六月色婷婷 | 色综合久久久久久中文网 | 九九九视频在线 | a级国产乱理伦片在线播放 久久久久国产精品一区 | 一区二区三区视频在线 | 欧洲亚洲激情 | 久久久久国产成人免费精品免费 | 欧美一二三区播放 | 亚洲高清精品在线 | 99久久日韩精品视频免费在线观看 | 91| 在线91观看 | 欧美久久久久久久久久久久 | 91污视频在线观看 | 少妇bbbb揉bbbb日本 | 精品亚洲成a人在线观看 | 不卡电影免费在线播放一区 | 香蕉视频一级 | 免费高清在线观看电视网站 | 国产99精品在线观看 | 日韩黄色软件 | 国产精品一区二区久久国产 | 一区二区中文字幕在线观看 | 最新av网址在线观看 | 一区二区三区四区五区在线 | 久久精品福利视频 | 国产视频日韩 | 国产在线观看你懂得 | 在线电影日韩 | 91私密视频 | 99久久日韩精品免费热麻豆美女 | 免费看的av片| 在线精品在线 | 久久久午夜视频 | 亚洲视频每日更新 | 色婷在线 | 欧美精品亚州精品 | 国产日韩在线视频 | 国产精品视频免费在线观看 | 国产午夜av | 干天天| 91视频下载 | 天天干天天碰 | 999色视频 | 成人黄色电影在线观看 | 国产欧美精品一区二区三区四区 | 国产精品电影一区 | 国产精品久久久久久久久久免费 | 久久婷婷色 | 在线免费试看 | 日韩夜夜爽 | 欧美国产日韩中文 | www在线观看视频 | 成人在线视频免费观看 | 久草视频资源 | 午夜视频在线观看一区二区三区 | 激情欧美一区二区三区免费看 | 免费观看全黄做爰大片国产 | 久久精品伊人 | 婷婷六月丁 | 日本激情中文字幕 | 欧美性极品xxxx娇小 | 亚洲国产网址 | 欧美视频日韩视频 | 日韩专区在线 | 日韩欧美精品在线 | 少妇bbbb揉bbbb日本 | 视频在线一区二区三区 | 狠狠色丁香婷婷综合 | 久久99久久精品国产 | 超碰日韩在线 | 日韩欧美在线一区二区 | 久青草影院 | 亚洲综合视频在线 | 91网免费看 | 国产资源网 | 午夜色性片 | 免费av 在线 | 中文字幕av免费在线观看 | 九九精品久久久 | 国精产品999国精产品视频 | 99精品视频免费观看 | 日韩免费 | 成人久久电影 | 中文av影院| 久久手机免费视频 | 成 人 黄 色 视频 免费观看 | 欧美成年网站 | 日韩一三区 | 欧美va天堂在线电影 | 激情综合网五月激情 | 中文字幕在线看视频国产 | 激情av综合| 丁香综合av | 美女免费黄视频网站 | 日韩综合精品 | 碰超在线97人人 | 日韩精品在线视频免费观看 | 久久国产精品久久久久 | 欧美日韩国产高清视频 | 久久成人资源 | 91免费试看 | 99视频久久 | 国产一级片播放 | 久操中文字幕在线观看 | zzijzzij亚洲日本少妇熟睡 | 亚洲高清激情 | 黄色一级在线免费观看 | 国产精品精品久久久久久 | 99热日本| 精品无人国产偷自产在线 | 中文字幕在线免费播放 | 久久精品国产第一区二区三区 | 丁香六月久久综合狠狠色 | 一区二区欧美日韩 | 久久精品高清 | 人人干人人艹 | 亚洲精品国产精品国自产观看 | 911国产 | 天堂网av 在线| 婷婷在线看 | 免费在线色| 在线观看色视频 | 久久艹艹 | 欧美午夜剧场 | 久久精品99国产精品 | 日韩精品视频免费专区在线播放 | 亚洲乱码久久久 | 国产在线理论片 | 色就色,综合激情 | 亚洲精品国偷拍自产在线观看蜜桃 | 在线高清av | 免费网站黄色 | 五月婷婷av | 午夜美女福利 | 日韩视频一区二区在线观看 | 五月天色站| 久久久2o19精品 | 国产理论一区二区三区 | 成人免费在线看片 | 特级西西人体444是什么意思 | 久久久www | 婷婷在线网站 | 国产精品永久免费 | 99c视频高清免费观看 | 成人黄色在线观看视频 | 成人免费av电影 | 在线观看视频你懂的 | 国产精品第 | 日韩在线视频精品 | 中文字幕视频一区 | 99免在线观看免费视频高清 | 黄色毛片视频免费观看中文 | 国产精品久久久久三级 | 午夜狠狠操 | 911国产在线观看 | 久草综合视频 | 超薄丝袜一二三区 |