線程啟動和建立

來源:互聯網
上載者:User

標籤:class   系統   str   方法   一個   microsoft   font   錯誤   應該   

建立和啟動線程

在java中建立一個線程如下:

Thread thread = new Thread();

調用方法start()來啟動一個線程:

thread.start();

        這個例子沒有指定線程執行任何代碼,線程將會在啟動之後停止。

        有兩種方式指定線程應該執行什麼代碼。第一種方式就是建立一個Thread的子類並覆寫run()方法。第二種方式就是建立一個實現Runnable介面的類。

Thread的子類

      第一種方式指定線程執行什麼樣的代碼,就是建立一個Thread的子類,並且覆寫run()方法。在run()方法裡的代碼就是你調用start()方法後,線程要執行的代碼。下面是一個建立Thread子類的例子:

public class MyThread extends Thread{

       @Override

        public void run(){

             System.out.println("MyThread running");

        }

}

為了建立並啟動上面的線程,你應該這樣做:

MyThread myThread = new MyThread();

myThread.start();

start()方法會線上程開始後立馬返回,而不是等到run()方法執行完畢。當run()執行時,就會輸出“MyThread running”;

當然,你也可以建立一個Thread的匿名子類,如下:

Thread thread = new Thread(){

      @Override

       public void run(){

                System.out.println("Thread Running");

       }

}

thread.start();

上面的例子當線程被調用時會輸出文本“Thread Running".

實現Runnable介面

     第二種方式指定線程應該執行什麼樣的代碼,就是建立一個實現java.lang.Runnable介面的類。這個Runnable對象可以被Thread執行。

     下面是一個實現了Runnable介面的例子:

public class MyRunnable implements Runnable{

      @Override

      public void run(){

            System.out.println("MyRunnable running");

      }

}

因為有了Thread線程執行的run()方法,將MyRunnable的一個執行個體傳給Thread的構造方法。

Thread thread = new Thread(new MyRunnable());

thread.start();

    當線程啟動時,會調用MyRunnable執行個體中的run()方法,而不是Thread自己的run()方法。上面的例子會輸出”MyRunnable running".

當然,你也可以建立一個匿名的Runnable介面執行個體:

Runnable myRunnable = new Runnable(){

        @Override

        public void run(){

               System.out.println("Runnable running");

         }

}

Thread thread = new Thread(myRunnable);

thread.start();

Subclass or Runnable?

       沒有明確的規則說這兩種方式哪一種是最好的。個人傾向於實現Runnable介面。將實現Runable介面的一個執行個體交給Thread的執行個體。當由線程池來執行實現Runnable介面的線程執行個體時,當線程池沒有空閑線程可以調試時,可以讓這些線程很好的排隊。但是如果執行的是實現Thread的子類的線程執行個體,那麼將會很難做到這一點。

       有時,你可能要同時實現Runnable和Thread子類。例如:建立一個Thread的線程可以執行一個或多個Runable執行個體,這就是線程池的實現方式。

常見的陷阱:調用run()方法而不是start()方法

      當建立和啟動一個線程,通常會犯的一個錯誤就是調用run()方法,而不是start()方法,如下:

Thread newThread = new Thread(MyRunnable());

newThread.run(); // should be start();

起初,你可能沒有注意到什麼,因為run()正如你期待的那樣被執行了。然而,他並不是被你剛建立的線程所執行。而是被建立線程的線程執行。換句話說,就是執行上面兩行代碼的線程來執行的run()裡的方法。調用線程的使用start()方法。

線程名稱

       當你建立一個線程時,你可以給這個線程指定名稱。線程名可以讓你和其他的線程進行區分。舉個例子:

Thread thread = new Thread("New Thread"){

       @override

       public void run(){

              System.out.println("run by:"+getName());

      }

}

thread.start();

System.out.println(thread.getName());

注意,字串“New Thread"作為一個參數傳給Thread的構造器,這個字串就是線程的名稱,這個名稱可以通過方法getName()來擷取到,你也可以傳遞參數的方式給一個實現Runnable的介面的線程指定線程名稱:如下

MyRunnable runnable = new MyRunnable();

Thread thread = new Thread(runnable,"New Thread");

thread.start();

System.out.println(thread.getName());

注意。MyRunnable不是Thread的一個子類,他不能直接調用Thread的getName()方法。

Thread.currentThread()

Thread.currentThread()方法返回線程正在執行的線程。

Thread thread = Thread.currentThread();

只要擷取到當前運行線程,你就可以在此基礎上進行方法的調用。例如:你可以擷取到當前正在執行線程的名稱。

String threadName = Thread.currentThread().getName();

Java Thread example

這裡有一個小例子。首先輸出執行main方法的線程名稱。這個線程是由JVM指定的。然後開啟10個線程,並以”“+i作為他們的線程名。每個線程輸出他們的名字後,然後停止。

public class ThreadExample{

     public static void main(String[] args){

           System.out.println(Thread.currentThread().getName());

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

              new Thread(""+i){

                   public void run(){

                       System.out.println("Thread:"+getName()+"running");

                   }

             }.start();

         }

      }

}

注意。線程並不是有序執行的。也就是說線程1並不是第一個執行的線程,這是因為線程的執行原則是並行的,而不是有序的,JVM和作業系統決線程的調度順序。當他們調度時順序是不固定的。

 

線程啟動和建立

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.