<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    www.baidu.com

    JavaCode--我愛你,芳兒

    JavaStudy--我愛你,芳兒

    Java線程學(xué)習(xí)(轉(zhuǎn))

      編寫具有多線程能力的程序經(jīng)常會(huì)用到的方法有:

      run(),start(),wait(),notify(),notifyAll(),sleep(),yield(),join()

      還有一個(gè)重要的關(guān)鍵字:synchronized

      本文將對(duì)以上內(nèi)容進(jìn)行講解。

      一:run()和start()

      示例1:

      publicclassThreadTestextendsThread{
      publicvoidrun(){
       for(inti=0;i<10;i++){
        System.out.print(""+i);
       }
      }
      publicstaticvoidmain(String[]args){
       newThreadTest().start();
       newThreadTest().start();
      }
    }

      這是個(gè)簡(jiǎn)單的多線程程序。run()和start()是大家都很熟悉的兩個(gè)方法。把希望并行處理的代碼都放在run()中;stat()用于自動(dòng)調(diào)用run(),這是JAVA的內(nèi)在機(jī)制規(guī)定的。并且run()的訪問控制符必須是public,返回值必須是void(這種說法不準(zhǔn)確,run()沒有返回值),run()不帶參數(shù)。

      這些規(guī)定想必大家都早已知道了,但你是否清楚為什么run方法必須聲明成這樣的形式?這涉及到JAVA的方法覆蓋和重載的規(guī)定。這些內(nèi)容很重要,請(qǐng)讀者參考相關(guān)資料。

      二:關(guān)鍵字synchronized

      有了synchronized關(guān)鍵字,多線程程序的運(yùn)行結(jié)果將變得可以控制。synchronized關(guān)鍵字用于保護(hù)共享數(shù)據(jù)。請(qǐng)大家注意"共享數(shù)據(jù)",你一定要分清哪些數(shù)據(jù)是共享數(shù)據(jù),JAVA是面向?qū)ο蟮某绦蛟O(shè)計(jì)語言,所以初學(xué)者在編寫多線程程序時(shí),容易分不清哪些數(shù)據(jù)是共享數(shù)據(jù)。請(qǐng)看下面的例子:

      示例2:

      publicclassThreadTestimplementsRunnable{
      publicsynchronizedvoidrun(){
       for(inti=0;i<10;i++){
        System.out.print(""+i);
       }
      }
      publicstaticvoidmain(String[]args){
       Runnabler1=newThreadTest();
       Runnabler2=newThreadTest();
       Threadt1=newThread(r1);
       Threadt2=newThread(r2);
       t1.start();
       t2.start();
      }
    }

      在這個(gè)程序中,run()被加上了synchronized關(guān)鍵字。在main方法中創(chuàng)建了兩個(gè)線程。你可能會(huì)認(rèn)為此程序的運(yùn)行結(jié)果一定為:0123456789

      0123456789。但你錯(cuò)了!這個(gè)程序中synchronized關(guān)鍵字保護(hù)的不是共享數(shù)據(jù)(其實(shí)在這個(gè)程序中synchronized關(guān)鍵字沒有起到任何作用,此程序的運(yùn)行結(jié)果是不可預(yù)先確定的)。這個(gè)程序中的t1,t2是兩個(gè)對(duì)象(r1,r2)的線程。JAVA是面向?qū)ο蟮某绦蛟O(shè)計(jì)語言,不同的對(duì)象的數(shù)據(jù)是不同的,r1,r2有各自的run()方法,而synchronized使同一個(gè)對(duì)象的多個(gè)線程,在某個(gè)時(shí)刻只有其中的一個(gè)線程可以訪問這個(gè)對(duì)象的synchronized數(shù)據(jù)。每個(gè)對(duì)象都有一個(gè)"鎖標(biāo)志",當(dāng)這個(gè)對(duì)象的一個(gè)線程訪問這個(gè)對(duì)象的某個(gè)synchronized數(shù)據(jù)時(shí),這個(gè)對(duì)象的所有被synchronized修飾的數(shù)據(jù)將被上鎖(因?yàn)?鎖標(biāo)志"被當(dāng)前線程拿走了),只有當(dāng)前線程訪問完它要訪問的synchronized數(shù)據(jù)時(shí),當(dāng)前線程才會(huì)釋放"鎖標(biāo)志",這樣同一個(gè)對(duì)象的其它線程才有機(jī)會(huì)訪問synchronized數(shù)據(jù)。

      示例3:

      publicclassThreadTestimplementsRunnable{
      publicsynchronizedvoidrun(){
       for(inti=0;i<10;i++){
        System.out.print(""+i);
       }
      }
      publicstaticvoidmain(String[]args){
       Runnabler=newThreadTest();
       Threadt1=newThread(r);
       Threadt2=newThread(r);
       t1.start();
       t2.start();
      }
    }

     

    如果你運(yùn)行1000次這個(gè)程序,它的輸出結(jié)果也一定每次都是:01234567890123456789。因?yàn)檫@里的synchronized保護(hù)的是共享數(shù)據(jù)。

      t1,t2是同一個(gè)對(duì)象(r)的兩個(gè)線程,當(dāng)其中的一個(gè)線程(例如:t1)開始執(zhí)行run()方法時(shí),由于run()受synchronized保護(hù),所以同一個(gè)對(duì)象的其他線程(t2)無法訪問synchronized方法(run方法)。只有當(dāng)t1執(zhí)行完后t2才有機(jī)會(huì)執(zhí)行。

      示例4:

      publicclassThreadTestimplementsRunnable{
      publicvoidrun(){
       synchronized(this){
        for(inti=0;i<10;i++){
         System.out.print(""+i);
        }
       }
      }
      publicstaticvoidmain(String[]args){
       Runnabler=newThreadTest();
       Threadt1=newThread(r);
       Threadt2=newThread(r);
       t1.start();
       t2.start();
      }
    }

      這個(gè)程序與示例3的運(yùn)行結(jié)果一樣。在可能的情況下,應(yīng)該把保護(hù)范圍縮到最小,可以用示例4的形式,this代表"這個(gè)對(duì)象"。沒有必要把整個(gè)run()保護(hù)起來,run()中的代碼只有一個(gè)for循環(huán),所以只要保護(hù)for循環(huán)就可以了。

      示例5:

      publicclassThreadTestimplementsRunnable{
      publicvoidrun(){
       for(intk=0;k<5;k++){
        System.out.println(Thread.currentThread().getName()
                 +":forloop:"+k);
       }
       synchronized(this){
        for(intk=0;k<5;k++){
         System.out.println(Thread.currentThread().getName()
                  +":synchronizedforloop:"+k);
        }
       }
      }
      publicstaticvoidmain(String[]args){
       Runnabler=newThreadTest();
       Threadt1=newThread(r,"t1_name");
       Threadt2=newThread(r,"t2_name");
       t1.start();
       t2.start();
      }
    }

      運(yùn)行結(jié)果:t1_name:forloop:0

      t1_name:forloop:1
       t1_name:forloop:2
       t2_name:forloop:0
       t1_name:forloop:3
       t2_name:forloop:1
       t1_name:forloop:4
       t2_name:forloop:2
       t1_name:synchronizedforloop:0
       t2_name:forloop:3
       t1_name:synchronizedforloop:1
       t2_name:forloop:4
       t1_name:synchronizedforloop:2
       t1_name:synchronizedforloop:3
       t1_name:synchronizedforloop:4
       t2_name:synchronizedforloop:0
       t2_name:synchronizedforloop:1
       t2_name:synchronizedforloop:2
       t2_name:synchronizedforloop:3
       t2_name:synchronizedforloop:4

      第一個(gè)for循環(huán)沒有受synchronized保護(hù)。對(duì)于第一個(gè)for循環(huán),t1,t2可以同時(shí)訪問。運(yùn)行結(jié)果表明t1執(zhí)行到了k=2時(shí),t2開始執(zhí)行了。t1首先執(zhí)行完了第一個(gè)for循環(huán),此時(shí)還沒有執(zhí)行完第一個(gè)for循環(huán)(t2剛執(zhí)行到k=2)。t1開始執(zhí)行第二個(gè)for循環(huán),當(dāng)t1的第二個(gè)for循環(huán)執(zhí)行到k=1時(shí),t2的第一個(gè)for循環(huán)執(zhí)行完了。http://bianceng.cn(編程入門)

      t2想開始執(zhí)行第二個(gè)for循環(huán),但由于t1首先執(zhí)行了第二個(gè)for循環(huán),這個(gè)對(duì)象的鎖標(biāo)志自然在t1手中(synchronized方法的執(zhí)行權(quán)也就落到了t1手中),在t1沒執(zhí)行完第二個(gè)for循環(huán)的時(shí)候,它是不會(huì)釋放鎖標(biāo)志的。

      所以t2必須等到t1執(zhí)行完第二個(gè)for循環(huán)后,它才可以執(zhí)行第二個(gè)for循環(huán)

      三:sleep()

      示例6:

      publicclassThreadTestimplementsRunnable{
      publicvoidrun(){
       for(intk=0;k<5;k++){
        if(k==2){
         try{
          Thread.currentThread().sleep(5000);
         }
         catch(Exceptione){}
        }
        System.out.print(""+k);
       }
      }
      publicstaticvoidmain(String[]args){
       Runnabler=newThreadTest();
       Threadt=newThread(r);
       t.start();
      }
    }

     

      sleep方法會(huì)使當(dāng)前的線程暫停執(zhí)行一定時(shí)間(給其它線程運(yùn)行機(jī)會(huì))。讀者可以運(yùn)行示例6,看看結(jié)果就明白了。sleep方法會(huì)拋出異常,必須提供捕獲代碼。

      示例7:

     publicclassThreadTestimplementsRunnable{
      publicvoidrun(){
       for(intk=0;k<5;k++){
        if(k==2){
         try{
          Thread.currentThread().sleep(5000);
         }
         catch(Exceptione){}
        }
        System.out.println(Thread.currentThread().getName()
                 +":"+k);
       }
      }
      publicstaticvoidmain(String[]args){
       Runnabler=newThreadTest();
       Threadt1=newThread(r,"t1_name");
       Threadt2=newThread(r,"t2_name");
       t1.setPriority(Thread.MAX_PRIORITY);
       t2.setPriority(Thread.MIN_PRIORITY);
       t1.start();
       t2.start();
      }
    }

      t1被設(shè)置了最高的優(yōu)先級(jí),t2被設(shè)置了最低的優(yōu)先級(jí)。t1不執(zhí)行完,t2就沒有機(jī)會(huì)執(zhí)行。但由于t1在執(zhí)行的中途休息了5秒中,這使得t2就有機(jī)會(huì)執(zhí)行了。

      讀者可以運(yùn)行這個(gè)程序試試看。

      示例8:

      publicclassThreadTestimplementsRunnable{
      publicsynchronizedvoidrun(){
       for(intk=0;k<5;k++){
        if(k==2){
         try{
          Thread.currentThread().sleep(5000);
         }
         catch(Exceptione){}
        }
        System.out.println(Thread.currentThread().getName()
                 +":"+k);
       }
      }
      publicstaticvoidmain(String[]args){
       Runnabler=newThreadTest();
       Threadt1=newThread(r,"t1_name");
       Threadt2=newThread(r,"t2_name");
       t1.start();
       t2.start();
      }
    }

      請(qǐng)讀者首先運(yùn)行示例8程序,從運(yùn)行結(jié)果上看:一個(gè)線程在sleep的時(shí)候,并不會(huì)釋放這個(gè)對(duì)象的鎖標(biāo)志。

     

    四:join()

      示例9:

      publicclassThreadTestimplementsRunnable{
      publicstaticinta=0;
      publicvoidrun(){
       for(intk=0;k<5;k++){
        a=a+1;
       }
      }
      publicstaticvoidmain(String[]args){
       Runnabler=newThreadTest();
       Threadt=newThread(r);
       t.start();
       System.out.println(a);
      }
    }

      請(qǐng)問程序的輸出結(jié)果是5嗎?答案是:有可能。其實(shí)你很難遇到輸出5的時(shí)候,通常情況下都不是5。這里不講解為什么輸出結(jié)果不是5,我要講的是:

      怎樣才能讓輸出結(jié)果為5!其實(shí)很簡(jiǎn)單,join()方法提供了這種功能。join()方法,它能夠使調(diào)用該方法的線程在此之前執(zhí)行完畢。

      把示例9的main()方法該成如下這樣:

    publicstaticvoidmain(String[]args)throwsException{
      Runnabler=newThreadTest();
      Threadt=newThread(r);
      t.start();
      t.join();
      System.out.println(a);
    }

      這時(shí),輸出結(jié)果肯定是5!join()方法會(huì)拋出異常,應(yīng)該提供捕獲代碼。或留給JDK捕獲。

      示例10:

    publicclassThreadTestimplementsRunnable{
      publicvoidrun(){
       for(intk=0;k<10;k++){
        System.out.print(""+k);
       }
      }
      publicstaticvoidmain(String[]args)throwsException{
       Runnabler=newThreadTest();
       Threadt1=newThread(r);
       Threadt2=newThread(r);
       t1.start();
       t1.join();
       t2.start();
      }
    }

      運(yùn)行這個(gè)程序,看看結(jié)果是否與示例3一樣


    五:yield()

      yield()方法與sleep()方法相似,只是它不能由用戶指定線程暫停多長(zhǎng)時(shí)間。按照SUN的說法:

      sleep方法可以使低優(yōu)先級(jí)的線程得到執(zhí)行的機(jī)會(huì),當(dāng)然也可以讓同優(yōu)先級(jí)和高優(yōu)先級(jí)的線程有執(zhí)行的機(jī)會(huì)。而yield()

      方法只能使同優(yōu)先級(jí)的線程有執(zhí)行的機(jī)會(huì)。

      示例11:

    publicclassThreadTestimplementsRunnable{
      publicvoidrun(){
       8
         for(intk=0;k<10;k++){
        if(k==5&&Thread.currentThread().getName().equals("t1")){
         Thread.yield();
        }
        System.out.println(Thread.currentThread().getName()
                 +":"+k);
       }
      }
      
    publicstaticvoidmain(String[]args){
       Runnabler=newThreadTest();
       Threadt1=newThread(r,"t1");
       Threadt2=newThread(r,"t2");
       t1.setPriority(Thread.MAX_PRIORITY);
       t2.setPriority(Thread.MIN_PRIORITY);
       t1.start();
       t2.start();
      }
    }

      輸出結(jié)果:

      t1:0
       t1:1
       t1:2
       t1:3
       t1:4
       t1:5
       t1:6
       t1:7
       t1:8
       t1:9
       t2:0
       t2:1
       t2:2
       t2:3
       t2:4
       t2:5
       t2:6
       t2:7
       t2:8
       t2:9

      多次運(yùn)行這個(gè)程序,輸出也是一樣。這說明:yield()方法不會(huì)使不同優(yōu)先級(jí)的線程有執(zhí)行的機(jī)會(huì)。

       六:wait(),notify(),notifyAll()

      首先說明:wait(),notify(),notifyAll()這些方法由java.lang.Object類提供,而上面講到的方法都是由java.lang.Thread類提供(Thread類實(shí)現(xiàn)了Runnable接口)。

      wait(),notify(),notifyAll()這三個(gè)方法用于協(xié)調(diào)多個(gè)線程對(duì)共享數(shù)據(jù)的存取,所以必須在synchronized語句塊內(nèi)使用這三個(gè)方法。先看下面了例子:

      示例12:

    publicclassThreadTestimplementsRunnable{
      publicstaticintshareVar=0;
      publicsynchronizedvoidrun(){
       if(shareVar==0){
        for(inti=0;i<10;i++){
         shareVar++;
         if(shareVar==5){
          try{
           this.wait();
          }
          catch(Exceptione){}
         }
        }
       }
       if(shareVar!=0){
        System.out.print(Thread.currentThread().getName());
        System.out.println("shareVar="+shareVar);
        this.notify();
       }
      }
      publicstaticvoidmain(String[]args){
       Runnabler=newThreadTest();
       Threadt1=newThread(r,"t1");
       10
         Threadt2=newThread(r,"t2");
       t1.start();
       t2.start();
      }
    }

      運(yùn)行結(jié)果:

      t2shareVar=5

      t1shareVar=10

      t1線程最先執(zhí)行。由于初始狀態(tài)下shareVar為0,t1將使shareVar連續(xù)加1,當(dāng)shareVar的值為5時(shí),t1調(diào)用wait()方法,t1將處于休息狀態(tài),同時(shí)釋放鎖標(biāo)志。這時(shí)t2得到了鎖標(biāo)志開始執(zhí)行,shareVar的值已經(jīng)變?yōu)?,所以t2直接輸出shareVar的值,然后再調(diào)用notify()方法喚醒t1。t1接著上次休息前的進(jìn)度繼續(xù)執(zhí)行,把shareVar的值一直加到10,由于此刻shareVar的值不為0,所以t1將輸出此刻shareVar的值,然后再調(diào)用notify()方法,由于此刻已經(jīng)沒有等待鎖標(biāo)志的線程,所以此調(diào)用語句不起任何作用。

      這個(gè)程序簡(jiǎn)單的示范了wait(),notify()的用法,讀者還需要在實(shí)踐中繼續(xù)摸索。


     七:關(guān)于線程的補(bǔ)充

      編寫一個(gè)具有多線程能力的程序可以繼承Thread類,也可以實(shí)現(xiàn)Runnable接口。在這兩個(gè)方法中如何選擇呢?從面向?qū)ο蟮慕嵌瓤紤],作者建議你實(shí)現(xiàn)Runnable接口。有時(shí)你也必須實(shí)現(xiàn)Runnable接口,例如當(dāng)你編寫具有多線程能力的小應(yīng)用程序的時(shí)候。

      線程的調(diào)度:NewRunningRunnableOtherwiseBlockedDeadBlockedinobject`sit()

      poolBlockedinobject`slockpoolnotify()Schedulercompletesrun()start()

      sleep()orjoin()sleep()timeoutorthreadjoin()sorinterupt()

      Lockavailablesynchronized()Threadstates

      terupt()一個(gè)Thread對(duì)象在它的生命周期中會(huì)處于各種不同的狀態(tài),上圖形象地說明了這點(diǎn)。wain

      調(diào)用start()方法使線程處于可運(yùn)行狀態(tài),這意味著它可以由JVM調(diào)度并執(zhí)行。這并不意味著線程就會(huì)立即運(yùn)行。

      實(shí)際上,程序中的多個(gè)線程并不是同時(shí)執(zhí)行的。除非線程正在真正的多CPU計(jì)算機(jī)系統(tǒng)上執(zhí)行,否則線程使用單CPU必須輪流執(zhí)行。但是,由于這發(fā)生的很快,我們常常認(rèn)為這些線程是同時(shí)執(zhí)行的。


      JAVA運(yùn)行時(shí)系統(tǒng)的計(jì)劃調(diào)度程序是搶占性的。如果計(jì)劃調(diào)度程序正在運(yùn)行一個(gè)線程并且來了另一個(gè)優(yōu)先級(jí)更高的線程,那么當(dāng)前正在執(zhí)行的線程就被暫時(shí)終止而讓更高優(yōu)先級(jí)的線程執(zhí)行。

      JAVA計(jì)劃調(diào)度程序不會(huì)為與當(dāng)前線程具有同樣優(yōu)先級(jí)的另一個(gè)線程去搶占當(dāng)前的線程。但是,盡管計(jì)劃調(diào)度程序本身沒有時(shí)間片(即它沒有給相同優(yōu)先級(jí)的線程以執(zhí)行用的時(shí)間片),但以Thread類為基礎(chǔ)的線程的系統(tǒng)實(shí)現(xiàn)可能會(huì)支持時(shí)間片分配。這依賴具體的操作系統(tǒng),Windows與UNIX在這個(gè)問題上的支持不會(huì)完全一樣。

      由于你不能肯定小應(yīng)用程序?qū)⑦\(yùn)行在什么操作系統(tǒng)上,因此你不應(yīng)該編寫出依賴時(shí)間片分配的程序。就是說,應(yīng)該使用yield方法以允許相同優(yōu)先級(jí)的線程有機(jī)會(huì)執(zhí)行而不是希望每一個(gè)線程都自動(dòng)得到一段CPU時(shí)間片。

      Thread類提供給你與系統(tǒng)無關(guān)的處理線程的機(jī)制。但是,線程的實(shí)際實(shí)現(xiàn)取決于JAVA運(yùn)行所在的操作系統(tǒng)。因此,線程化的程序確實(shí)是利用了支持線程的操作系統(tǒng)。

      當(dāng)創(chuàng)建線程時(shí),可以賦予它優(yōu)先級(jí)。它的優(yōu)先級(jí)越高,它就越能影響運(yùn)行系統(tǒng)。

      JAVA運(yùn)行系統(tǒng)使用一個(gè)負(fù)責(zé)在所有執(zhí)行JAVA程序內(nèi)運(yùn)行所有存在的計(jì)劃調(diào)度程序。

      該計(jì)劃調(diào)度程序?qū)嶋H上使用一個(gè)固定優(yōu)先級(jí)的算法來保證每個(gè)程序中的最高優(yōu)先級(jí)的線程得到CPU--允許最高優(yōu)先級(jí)的線程在其它線程之前執(zhí)行。

      對(duì)于在一個(gè)程序中有幾個(gè)相同優(yōu)先級(jí)的線程等待執(zhí)行的情況,該計(jì)劃調(diào)度程序循環(huán)地選擇它們,當(dāng)進(jìn)行下一次選擇時(shí)選擇前面沒有執(zhí)行的線程,

      具有相同優(yōu)先級(jí)的所有的線程都受到平等的對(duì)待。較低優(yōu)先級(jí)的線程在較高優(yōu)先級(jí)的線程已經(jīng)死亡或者進(jìn)入不可執(zhí)行狀態(tài)之后才能執(zhí)行。

      繼續(xù)討論wait(),notify(),notifyAll():

      當(dāng)線程執(zhí)行了對(duì)一個(gè)特定對(duì)象的wait()調(diào)用時(shí),那個(gè)線程被放到與那個(gè)對(duì)象相關(guān)的等待池中。此外,調(diào)用wait()的線程自動(dòng)釋放對(duì)象的鎖標(biāo)志。

      可以調(diào)用不同的wait():wait()或wait(longtimeout)

      對(duì)一個(gè)特定對(duì)象執(zhí)行notify()調(diào)用時(shí),將從對(duì)象的等待池中移走一個(gè)任意的線程,并放到鎖標(biāo)志等待池中,那里的線程一直在等待,直到可以獲得對(duì)象的鎖標(biāo)志。notifyAll()方法將從對(duì)象等待池中移走所有等待那個(gè)對(duì)象的線程并放到鎖標(biāo)志等待池中。

      只有鎖標(biāo)志等待池中的線程能獲取對(duì)象的鎖標(biāo)志,鎖標(biāo)志允許線程從上次因調(diào)用wait()而中斷的地方開始繼續(xù)運(yùn)行。

      在許多實(shí)現(xiàn)了wait()/notify()機(jī)制的系統(tǒng)中,醒來的線程必定是那個(gè)等待時(shí)間最長(zhǎng)的線程。然而,在Java技術(shù)中,并不保證這點(diǎn)。

      注意,不管是否有線程在等待,都可以調(diào)用notify()。如果對(duì)一個(gè)對(duì)象調(diào)用notify()方法,而在這個(gè)對(duì)象的鎖標(biāo)志等待池中并沒有線程,那么notify()調(diào)用將不起任何作用。

      在JAVA中,多線程是一個(gè)神奇的主題。之所以說它"神奇",是因?yàn)槎嗑€程程序的運(yùn)行結(jié)果不可預(yù)測(cè),但我們又可以通過某些方法控制多線程程序的執(zhí)行。

      要想靈活使用多線程,讀者還需要大量實(shí)踐。

      另外,從JDK1.2開始,SUN就不建議使用resume(),stop(),suspend()了。


     



     

    芳兒寶貝.我愛你

    posted on 2007-12-02 23:53 wǒ愛伱--咾婆 閱讀(431) 評(píng)論(3)  編輯  收藏

    評(píng)論

    # re: Java線程學(xué)習(xí)(轉(zhuǎn)) 2007-12-10 14:58 askpp1999

    不錯(cuò)   回復(fù)  更多評(píng)論   

    # re: Java線程學(xué)習(xí)(轉(zhuǎn)) 2008-01-02 14:40 你知道

    呵呵.看這么多字母.都不知道什么意思.不過我支持個(gè)先.  回復(fù)  更多評(píng)論   

    # re: Java線程學(xué)習(xí)(轉(zhuǎn)) 2008-10-04 14:59 德魯伊

    寫的不錯(cuò),支持不肯定的,還需要提供足夠的空間給你,讓你詳細(xì)說明每個(gè)方法的用法,以及對(duì)象的關(guān)系!  回復(fù)  更多評(píng)論   


    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     

    導(dǎo)航

    統(tǒng)計(jì)

    公告

    芳兒寶貝.我愛你


    黑客基地
    http://www.hackbase.com
    全球最大的黑客門戶網(wǎng)站


     最近在讀的書:

    常用鏈接

    留言簿(1)

    隨筆分類(37)

    JavaCode

    搜索

    積分與排名

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    主站蜘蛛池模板: 免费永久在线观看黄网站| 免费在线中文日本| 亚洲成a人片毛片在线| 在线观看日本亚洲一区| 国产va免费精品观看精品| 亚洲色图.com| 五月亭亭免费高清在线| 中文字幕亚洲精品资源网| 免费人成在线观看网站品爱网| 亚洲av综合色区| 免费无码中文字幕A级毛片| 亚洲麻豆精品果冻传媒| 91久久精品国产免费直播| 亚洲AV成人无码天堂| 午夜视频在线在免费| 色网站在线免费观看| 亚洲av午夜成人片精品电影| 日韩在线视频播放免费视频完整版| 国产偷窥女洗浴在线观看亚洲 | 男男gay做爽爽的视频免费| 国产精品免费视频播放器| 特a级免费高清黄色片 | 免费人成网站在线高清| 黄网站色在线视频免费观看| 国产日韩亚洲大尺度高清| 中文字幕无码免费久久9一区9| 一级做a爱片特黄在线观看免费看| 亚洲精品在线视频| 男人进去女人爽免费视频国产| 亚洲酒色1314狠狠做| 午夜小视频免费观看| 人人鲁免费播放视频人人香蕉| 国产成A人亚洲精V品无码性色| 青春禁区视频在线观看直播免费| 亚洲成av人片天堂网| 国产精品视频免费观看| 国产偷国产偷亚洲高清在线| 国产成人亚洲精品青草天美| 一二三四在线观看免费高清中文在线观看 | 亚洲免费福利视频| 精品无码人妻一区二区免费蜜桃|