java something

          不要以為......很遙遠(yuǎn)
          隨筆 - 23, 文章 - 1, 評論 - 2, 引用 - 0
          數(shù)據(jù)加載中……

          2011年8月24日

          Activity生命周期

          現(xiàn)有兩個(gè)Activity:  Activity1,Activity2

          先啟動Activity1運(yùn)行順序?yàn)椋?Activity1 onCreate -> Activity1 onStart -> Activity1 onResume
          用Intent從Activity1跳到Activity2運(yùn)行順序 : 
          Activity1 onPause -> Activity2 onCreate -> Activity2 onStart -> Activity2 onResume ->Activity1 onStop -> Activity1  onDestroy
          退出應(yīng)用程序: Activity2 onResume ->Activity2 onStop -> Activity2  onDestroy

          posted @ 2011-09-02 17:48 Jamie 閱讀(229) | 評論 (0)編輯 收藏

          控制3個(gè)線程運(yùn)行順序的Demo

          本程序可以控制3個(gè)線程按順序執(zhí)行, 代碼如下:

          public class Test3 {

           public static void main(String[] args) throws IOException {
            final Test obj = new Test();
            
            new Thread()
            {
             public void run()
             {
              obj.m1();
             }
            }.start();
            new Thread()
            {
             public void run()
             {
              obj.m2();
             }
            }.start();
            new Thread()
            {
             public void run()
             {
              obj.m3();
             }
            }.start();
            
           }

          }

          class Test
          {
           static int count;
           volatile int target = 1;
           synchronized void m1()
           { 
             for (int i = 0; i < 10; i++)
             {
              while (target == 2 || target == 3)
              {
               try {
                wait();
               } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
               }
              }
              System.out.println("m1() =" + i);
              target = 2;
              notifyAll();
             }
           }
           
           synchronized void m2()
           {
            for (int i = 0; i < 10; i++)
            {
             while (target == 1 || target == 3)
             {
              try {
               wait();
              } catch (InterruptedException e) {
               // TODO Auto-generated catch block
               e.printStackTrace();
              }
             }
             System.out.println("m2() =" + i);
             target = 3;
             notifyAll();
            }
           }
           
           synchronized void m3()
           {
            for (int i = 0; i < 10; i++)
            {
             while (target == 1 || target == 2)
             {
              try {
               wait();
              } catch (InterruptedException e) {
               // TODO Auto-generated catch block
               e.printStackTrace();
              }
             }
             System.out.println("m3() =" + i);
             target = 1;
             notifyAll();
            }
           }
          }

          posted @ 2011-09-02 02:27 Jamie 閱讀(1777) | 評論 (2)編輯 收藏

          線程的同步與共享

               摘要: 線程的同步與共享 前面程序中的線程都是獨(dú)立的、異步執(zhí)行的線程。但在很多情況下,多個(gè)線程需要共享數(shù)據(jù)資源,這就涉及到線程的同步與資源共享的問題。 1 資源沖突 下面的例子說明,多個(gè)線程共享資源,如果不加以控制可能會產(chǎn)生沖突。 程序CounterTest.java   Code highlighting produced by Actipro CodeHighlight...  閱讀全文

          posted @ 2011-09-02 01:38 Jamie 閱讀(484) | 評論 (0)編輯 收藏

          線程的狀態(tài)與調(diào)度

            1,線程的生命周期

                  線程從創(chuàng)建、運(yùn)行到結(jié)束總是處于下面五個(gè)狀態(tài)之一:新建狀態(tài)、就緒狀態(tài)、運(yùn)行狀態(tài)、阻塞狀態(tài)及死亡狀態(tài)。



              1.新建狀態(tài)(New): 
                  當(dāng)用new操作符創(chuàng)建一個(gè)線程時(shí), 例如new Thread(r),線程還沒有開始運(yùn)行,此時(shí)線程處在新建狀態(tài)。 當(dāng)一個(gè)線程處于新生狀態(tài)時(shí),程序還沒有開始運(yùn)行線程中的代碼

               2.就緒狀態(tài)(Runnable)

                  一個(gè)新創(chuàng)建的線程并不自動開始運(yùn)行,要執(zhí)行線程,必須調(diào)用線程的start()方法。當(dāng)線程對象調(diào)用start()方法即啟動了線程,start()方法創(chuàng)建線程運(yùn)行的系統(tǒng)資源,并調(diào)度線程運(yùn)行run()方法。當(dāng)start()方法返回后,線程就處于就緒狀態(tài)。

                  處于就緒狀態(tài)的線程并不一定立即運(yùn)行run()方法,線程還必須同其他線程競爭CPU時(shí)間,只有獲得CPU時(shí)間才可以運(yùn)行線程。因?yàn)樵趩?/span>CPU的計(jì)算機(jī)系統(tǒng)中,不可能同時(shí)運(yùn)行多個(gè)線程,一個(gè)時(shí)刻僅有一個(gè)線程處于運(yùn)行狀態(tài)。因此此時(shí)可能有多個(gè)線程處于就緒狀態(tài)。對多個(gè)處于就緒狀態(tài)的線程是由Java運(yùn)行時(shí)系統(tǒng)的線程調(diào)度程序(thread scheduler)來調(diào)度的。

              3.運(yùn)行狀態(tài)(Running)

                  當(dāng)線程獲得CPU時(shí)間后,它才進(jìn)入運(yùn)行狀態(tài),真正開始執(zhí)行run()方法.

              
          4. 阻塞狀態(tài)(Blocked)

                  線程運(yùn)行過程中,可能由于各種原因進(jìn)入阻塞狀態(tài):
                  1>線程通過調(diào)用sleep方法進(jìn)入睡眠狀態(tài);
                  2>線程調(diào)用一個(gè)在I/O上被阻塞的操作,即該操作在輸入輸出操作完成之前不會返回到它的調(diào)用者;
                  3>線程試圖得到一個(gè)鎖,而該鎖正被其他線程持有;
                  4>線程在等待某個(gè)觸發(fā)條件;
                  ......           

                  所謂阻塞狀態(tài)是正在運(yùn)行的線程沒有運(yùn)行結(jié)束,暫時(shí)讓出
          CPU,這時(shí)其他處于就緒狀態(tài)的線程就可以獲得CPU時(shí)間,進(jìn)入運(yùn)行狀態(tài)。

              5. 死亡狀態(tài)(Dead)

                  有兩個(gè)原因會導(dǎo)致線程死亡:
                  1) run方法正常退出而自然死亡,
                  2) 一個(gè)未捕獲的異常終止了run方法而使線程猝死。
                  為了確定線程在當(dāng)前是否存活著(就是要么是可運(yùn)行的,要么是被阻塞了),需要使用isAlive方法。如果是可運(yùn)行或被阻塞,這個(gè)方法返回true; 如果線程仍舊是new狀態(tài)且不是可運(yùn)行的, 或者線程死亡了,則返回false.




          2,  線程的優(yōu)先級和調(diào)度

          Java的每個(gè)線程都有一個(gè)優(yōu)先級,當(dāng)有多個(gè)線程處于就緒狀態(tài)時(shí),線程調(diào)度程序根據(jù)線程的優(yōu)先級調(diào)度線程運(yùn)行。

          可以用下面方法設(shè)置和返回線程的優(yōu)先級。

              · public final void setPriority(int newPriority) 設(shè)置線程的優(yōu)先級。

              · public final int getPriority() 返回線程的優(yōu)先級。

          newPriority為線程的優(yōu)先級,其取值為110之間的整數(shù),也可以使用Thread類定義的常量來設(shè)置線程的優(yōu)先級,這些常量分別為:Thread.MIN_PRIORITYThread.NORM_PRIORITYThread.MAX_PRIORITY,它們分別對應(yīng)于線程優(yōu)先級的1510,數(shù)值越大優(yōu)先級越高。當(dāng)創(chuàng)建Java線程時(shí),如果沒有指定它的優(yōu)先級,則它從創(chuàng)建該線程那里繼承優(yōu)先級。

          一般來說,只有在當(dāng)前線程停止或由于某種原因被阻塞,較低優(yōu)先級的線程才有機(jī)會運(yùn)行。

          前面說過多個(gè)線程可并發(fā)運(yùn)行,然而實(shí)際上并不總是這樣。由于很多計(jì)算機(jī)都是單CPU的,所以一個(gè)時(shí)刻只能有一個(gè)線程運(yùn)行,多個(gè)線程的并發(fā)運(yùn)行只是幻覺。在單CPU機(jī)器上多個(gè)線程的執(zhí)行是按照某種順序執(zhí)行的,這稱為線程的調(diào)度(scheduling)

          大多數(shù)計(jì)算機(jī)僅有一個(gè)CPU,所以線程必須與其他線程共享CPU。多個(gè)線程在單個(gè)CPU是按照某種順序執(zhí)行的。實(shí)際的調(diào)度策略隨系統(tǒng)的不同而不同,通常線程調(diào)度可以采用兩種策略調(diào)度處于就緒狀態(tài)的線程。

          (1) 搶占式調(diào)度策略

               Java運(yùn)行時(shí)系統(tǒng)的線程調(diào)度算法是搶占式的 (preemptive)Java運(yùn)行時(shí)系統(tǒng)支持一種簡單的固定優(yōu)先級的調(diào)度算法。如果一個(gè)優(yōu)先級比其他任何處于可運(yùn)行狀態(tài)的線程都高的線程進(jìn)入就緒狀態(tài),那么運(yùn)行時(shí)系統(tǒng)就會選擇該線程運(yùn)行。新的優(yōu)先級較高的線程搶占(preempt)了其他線程。但是Java運(yùn)行時(shí)系統(tǒng)并不搶占同優(yōu)先級的線程。換句話說,Java運(yùn)行時(shí)系統(tǒng)不是分時(shí)的(time-slice)。然而,基于Java Thread類的實(shí)現(xiàn)系統(tǒng)可能是支持分時(shí)的,因此編寫代碼時(shí)不要依賴分時(shí)。當(dāng)系統(tǒng)中的處于就緒狀態(tài)的線程都具有相同優(yōu)先級時(shí),線程調(diào)度程序采用一種簡單的、非搶占式的輪轉(zhuǎn)的調(diào)度順序。

          (2) 時(shí)間片輪轉(zhuǎn)調(diào)度策略

              有些系統(tǒng)的線程調(diào)度采用時(shí)間片輪轉(zhuǎn)(round-robin)調(diào)度策略。這種調(diào)度策略是從所有處于就緒狀態(tài)的線程中選擇優(yōu)先級最高的線程分配一定的CPU時(shí)間運(yùn)行。該時(shí)間過后再選擇其他線程運(yùn)行。只有當(dāng)線程運(yùn)行結(jié)束、放棄(yield)CPU或由于某種原因進(jìn)入阻塞狀態(tài),低優(yōu)先級的線程才有機(jī)會執(zhí)行。如果有兩個(gè)優(yōu)先級相同的線程都在等待CPU,則調(diào)度程序以輪轉(zhuǎn)的方式選擇運(yùn)行的線程。

           3.  線程狀態(tài)的改變

          一個(gè)線程在其生命周期中可以從一種狀態(tài)改變到另一種狀態(tài),線程狀態(tài)的變遷如圖所示:

              
              
          1>  控制線程的啟動和結(jié)束

          當(dāng)一個(gè)新建的線程調(diào)用它的start()方法后即進(jìn)入就緒狀態(tài),處于就緒狀態(tài)的線程被線程調(diào)度程序選中就可以獲得CPU時(shí)間,進(jìn)入運(yùn)行狀態(tài),該線程就開始運(yùn)行run()方法。

          控制線程的結(jié)束稍微復(fù)雜一點(diǎn)。如果線程的run()方法是一個(gè)確定次數(shù)的循環(huán),則循環(huán)結(jié)束后,線程運(yùn)行就結(jié)束了,線程對象即進(jìn)入死亡狀態(tài)。如果run()方法是一個(gè)不確定循環(huán),早期的方法是調(diào)用線程對象的stop()方法,然而由于該方法可能導(dǎo)致線程死鎖,因此從1.1版開始,不推薦使用該方法結(jié)束線程。一般是通過設(shè)置一個(gè)標(biāo)志變量,在程序中改變標(biāo)志變量的值實(shí)現(xiàn)結(jié)束線程。請看下面的例子:

          程序 ThreadStop.java

          import java.util.*;

          class Timer implements Runnable{

              
          boolean flag=true;
              
          public void run(){
                
          while(flag){
                  System.out.print(
          "\r\t"+new Date()+"");
                  
          try{
                        Thread.sleep(
          1000);
                  }
          catch(InterruptedException e){} 
                }
                System.out.println(
          "\n"+Thread.currentThread().getName()+" Stop");
              }

              
          public void stopRun(){
                     flag 
          = false;
              }
          }

          public class ThreadStop{
              
          public static void main(String args[]){
                 Timer timer 
          = new Timer();
                 Thread thread 
          = new Thread(timer);       
                 thread.setName(
          "Timer");
                 thread.start();

                 
          for(int i=0;i<100;i++){
                   System.out.print(
          "\r"+i);
                  
          try{
                        Thread.sleep(
          100);
                  }
          catch(InterruptedException e){} 
                 }     
                 timer.stopRun();
              }
          }

          該程序在Timer類中定義了一個(gè)布爾變量flag,同時(shí)定義了一個(gè)stopRun()方法,在其中將該變量設(shè)置為false。在主程序中通過調(diào)用該方法,從而改變該變量的值,使得run()方法的while循環(huán)條件不滿足,從而實(shí)現(xiàn)結(jié)束線程的運(yùn)行。

          說明  Thread類中除了stop()方法被標(biāo)注為不推薦(deprecated) 使用外,suspend()方法和resume()方法也被標(biāo)明不推薦使用,這兩個(gè)方法原來用作線程的掛起和恢復(fù).

          2>  線程阻塞條件

          處于運(yùn)行狀態(tài)的線程除了可以進(jìn)入死亡狀態(tài)外,還可能進(jìn)入就緒狀態(tài)和阻塞狀態(tài)。下面分別討論這兩種情況:

          (1) 運(yùn)行狀態(tài)到就緒狀態(tài)

          處于運(yùn)行狀態(tài)的線程如果調(diào)用了yield()方法,那么它將放棄CPU時(shí)間,使當(dāng)前正在運(yùn)行的線程進(jìn)入就緒狀態(tài)。這時(shí)有幾種可能的情況:如果沒有其他的線程處于就緒狀態(tài)等待運(yùn)行,該線程會立即繼續(xù)運(yùn)行;如果有等待的線程,此時(shí)線程回到就緒狀態(tài)狀態(tài)與其他線程競爭CPU時(shí)間,當(dāng)有比該線程優(yōu)先級高的線程時(shí),高優(yōu)先級的線程進(jìn)入運(yùn)行狀態(tài),當(dāng)沒有比該線程優(yōu)先級高的線程時(shí),但有同優(yōu)先級的線程,則由線程調(diào)度程序來決定哪個(gè)線程進(jìn)入運(yùn)行狀態(tài),因此線程調(diào)用yield()方法只能將CPU時(shí)間讓給具有同優(yōu)先級的或高優(yōu)先級的線程而不能讓給低優(yōu)先級的線程。

          一般來說,在調(diào)用線程的yield()方法可以使耗時(shí)的線程暫停執(zhí)行一段時(shí)間,使其他線程有執(zhí)行的機(jī)會。

          (2) 運(yùn)行狀態(tài)到阻塞狀態(tài)

          有多種原因可使當(dāng)前運(yùn)行的線程進(jìn)入阻塞狀態(tài),進(jìn)入阻塞狀態(tài)的線程當(dāng)相應(yīng)的事件結(jié)束或條件滿足時(shí)進(jìn)入就緒狀態(tài)。使線程進(jìn)入阻塞狀態(tài)可能有多種原因:

          線程調(diào)用了sleep()方法,線程進(jìn)入睡眠狀態(tài),此時(shí)該線程停止執(zhí)行一段時(shí)間。當(dāng)時(shí)間到時(shí)該線程回到就緒狀態(tài),與其他線程競爭CPU時(shí)間。

          Thread類中定義了一個(gè)interrupt()方法。一個(gè)處于睡眠中的線程若調(diào)用了interrupt()方法,該線程立即結(jié)束睡眠進(jìn)入就緒狀態(tài)。

          如果一個(gè)線程的運(yùn)行需要進(jìn)行I/O操作,比如從鍵盤接收數(shù)據(jù),這時(shí)程序可能需要等待用戶的輸入,這時(shí)如果該線程一直占用CPU,其他線程就得不到運(yùn)行。這種情況稱為I/O阻塞。這時(shí)該線程就會離開運(yùn)行狀態(tài)而進(jìn)入阻塞狀態(tài)。Java語言的所有I/O方法都具有這種行為。

          ③ 有時(shí)要求當(dāng)前線程的執(zhí)行在另一個(gè)線程執(zhí)行結(jié)束后再繼續(xù)執(zhí)行,這時(shí)可以調(diào)用join()方法實(shí)現(xiàn),join()方法有下面三種格式:

          ·         public void join() throws InterruptedException 使當(dāng)前線程暫停執(zhí)行,等待調(diào)用該方法的線程結(jié)束后再執(zhí)行當(dāng)前線程。

          ·         public void join(long millis) throws InterruptedException 最多等待millis毫秒后,當(dāng)前線程繼續(xù)執(zhí)行。

          ·         public void join(long millis, int nanos) throws InterruptedException 可以指定多少毫秒、多少納秒后繼續(xù)執(zhí)行當(dāng)前線程。

          上述方法使當(dāng)前線程暫停執(zhí)行,進(jìn)入阻塞狀態(tài),當(dāng)調(diào)用線程結(jié)束或指定的時(shí)間過后,當(dāng)前線程線程進(jìn)入就緒狀態(tài),例如執(zhí)行下面代碼:

          t.join();

          將使當(dāng)前線程進(jìn)入阻塞狀態(tài),當(dāng)線程t執(zhí)行結(jié)束后,當(dāng)前線程才能繼續(xù)執(zhí)行。

          ④ 線程調(diào)用了wait()方法,等待某個(gè)條件變量,此時(shí)該線程進(jìn)入阻塞狀態(tài)。直到被通知(調(diào)用了notify()notifyAll()方法)結(jié)束等待后,線程回到就緒狀態(tài)。

          另外如果線程不能獲得對象鎖,也進(jìn)入就緒狀態(tài)。

          后兩種情況在下一節(jié)討論。



















          posted @ 2011-09-01 21:43 Jamie 閱讀(4010) | 評論 (0)編輯 收藏

          復(fù)習(xí)下java多線程

          好久沒搞這個(gè)了,今天把以前的筆記整理下,當(dāng)復(fù)習(xí)。

          Thread類和Runnable接口

          多線程是一個(gè)程序中可以有多段代碼同時(shí)運(yùn)行,那么這些代碼寫在哪里,如何創(chuàng)建線程對象呢?

              首先,我們來看Java語言實(shí)現(xiàn)多線程編程的類和接口。在java.lang包中定義了Runnable接口和Thread類。

           

          Runnable接口中只定義了一個(gè)方法:

          ·         public abstract void run()

          這個(gè)方法要由實(shí)現(xiàn)了Runnable接口的類實(shí)現(xiàn)。Runnable對象稱為可運(yùn)行對象,一個(gè)線程的運(yùn)行就是執(zhí)行該對象的run()方法。


                Thread
          類實(shí)現(xiàn)了Runnable接口,因此Thread對象也是可運(yùn)行對象。同時(shí)Thread類也是線程類,該類的常用構(gòu)造方法如下:

          ·         public Thread()

          ·         public Thread(Runnable target)

          ·         public Thread(String name)

          ·         public Thread(Runnable target, String name)
          target為線程運(yùn)行的目標(biāo)對象,即線程調(diào)用start()方法啟動后運(yùn)行那個(gè)對象的run()方法,該對象的類型為Runnable,若沒有指定目標(biāo)對象,則以當(dāng)前類對象為目標(biāo)對象,name為線程名


           

            線程的創(chuàng)建 

          介紹下如何創(chuàng)建和運(yùn)行線程的兩種方法。線程運(yùn)行的代碼就是實(shí)現(xiàn)了Runnable接口的類的run()方法或者是Thread類的子類的run()方法,因此構(gòu)造線程體就有兩種方法:
              ·         繼承Thread類并覆蓋它的run()方法;
              ·        
          實(shí)現(xiàn)Runnable接口并實(shí)現(xiàn)它的run()方法。

            1,繼承Thread類創(chuàng)建線程

          通過繼承Thread類,并覆蓋run()方法,這時(shí)就可以用該類的實(shí)例作為線程的目標(biāo)對象。下面的程序定義了SimpleThread類,它繼承了Thread類并覆蓋了run()方法。

          程序SimpleThread.java

          public class SimpleThread extends Thread{

            public SimpleThread(String str){

              super(str);

          }

          public void run(){

              for(int i=0; i<100; i++){

                System.out.println(getName()+" = "+ i);

                try{

                   sleep((int)(Math.random()*100));

                }catch(InterruptedException e){}

              }

          System.out.println(getName()+ " DONE");

          }

          }

          _____________________________________________________________________________

              SimpleThread類繼承了Thread類,并覆蓋了run()方法,該方法就是線程體。

          程序 ThreadTest.java

          public class ThreadTest{

            public static void main(String args[]){

              Thread t1 = new SimpleThread("Runner A");

              Thread t2 = new SimpleThread("Runner B");

              t1.start();

              t2.start();

           }

          }

          _____________________________________________________________________________

          ThreadTest類的main()方法中創(chuàng)建了兩個(gè)SimpleThread類的線程對象并調(diào)用線程類的start()方法啟動線程。構(gòu)造線程時(shí)沒有指定目標(biāo)對象,所以線程啟動后執(zhí)行本類的run()方法。

          注意,實(shí)際上ThreadTest程序中有三個(gè)線程同時(shí)運(yùn)行,在應(yīng)用程序的main()方法啟動時(shí),JVM就創(chuàng)建一個(gè)主線程,在主線程中可以創(chuàng)建其他線程。

            2,實(shí)現(xiàn)Runnable接口創(chuàng)建線程

          可以定義一個(gè)類實(shí)現(xiàn)Runnable接口,然后將該類對象作為線程的目標(biāo)對象。實(shí)現(xiàn)Runnable接口就是實(shí)現(xiàn)run()方法。

          下面程序通過實(shí)現(xiàn)Runnable接口構(gòu)造線程體。

          程序 ThreadTest.java

          class T1 implements Runnable{

            public void run(){

              for(int i=0;i<15;i++)

                System.out.println("Runner A="+i);

            }

          }

          class T2 implements Runnable{

            public void run(){

              for(int j=0;j<15;j++)

                System.out.println("Runner B="+j);

            }

          }

          public class ThreadTest{

            public static void main(String args[]){

              Thread t1=new Thread(new T1(),"Thread A");

              Thread t2=new Thread(new T2(),"Thread B");

              t1.start();

              t2.start();

            }

          }

          _____________________________________________________________________________




              

           



          posted @ 2011-09-01 20:46 Jamie 閱讀(388) | 評論 (0)編輯 收藏

          android 項(xiàng)目下文件的作用

          1, R.java 是建立項(xiàng)目時(shí)自動生成的,只讀,用來定義該項(xiàng)目所有資源的索引文件。
          這里面定義了很多常量, 名字與res文件夾的文件名和String.xml里的定義的常量名相同。當(dāng)項(xiàng)目中加入了新的資源時(shí),只需要刷新一下該項(xiàng)目,R.java 便自動生成了。
          2, strings.xml 里面定義了字符串資源。 
              在類中可通過如下方式使用這些資源, Resource r = this.getContext().getResources(); String str = ((String) r.getString(R.string.name));
              在main.xml中可以 android:text="@string/name"
          3,  mail.xml 用來寫UI(布局,控件...)
              主程序繼承Activity類,重寫了void onCreate(Bundle savedInstanceState)方法。 在方法里通過setContentView(R.layout.main)設(shè)置Activity要顯示的布局文件(\layout\main.xml)
          4.  AndroidManifest.xml
              看下默認(rèn)的:

          <?xml version="1.0" encoding="utf-8"?>
          <manifest xmlns:android="      package="com.test"
                android:versionCode="1"
                android:versionName="1.0">
              <uses-sdk android:minSdkVersion="8" />

              <application android:icon="@drawable/icon" android:label="@string/app_name">   //應(yīng)用程序的名字
                  <activity android:name=".WuActivity"   //默認(rèn)啟動哪個(gè)Activity
                            android:label="@string/app_name">
                      <intent-filter>
                          <action android:name="android.intent.action.MAIN" />
                          <category android:name="android.intent.category.LAUNCHER" />
                      </intent-filter>
                  </activity>

              </application>
          </manifest>

          posted @ 2011-08-24 02:33 Jamie 閱讀(1027) | 評論 (0)編輯 收藏

          主站蜘蛛池模板: 上蔡县| 黄山市| 泰兴市| 双流县| 湖北省| 新巴尔虎右旗| 韶山市| 固安县| 松溪县| 钦州市| 沧源| 石家庄市| 逊克县| 嘉善县| 新化县| 天柱县| 海丰县| 津南区| 英吉沙县| 金华市| 皮山县| 册亨县| 叙永县| 新邵县| 苏尼特左旗| 苗栗市| 白水县| 山东省| 游戏| 陆川县| 潞城市| 武冈市| 安国市| 聊城市| 东城区| 扎赉特旗| 宜良县| 丰台区| 盖州市| 新密市| 鲁山县|