Java併發編程的暗自努力(二)走進代碼

創建並運行Java線程

Java線程是一個object類,它的實例都繼承自java.lang.Thread或其子類

創建線程的辦法:

Thread thread = new Thread();

執行線程的辦法

thread.start();

編寫線程運行時的代碼有兩種方式:

1. 創建Thread子類

Step 1: 創建Thread子類並重寫run方法,run方法在調用start()方法後被執行

public class MyThread extends Thread{
    public void run(){
        // to do something
    }
}

Step 2: 創建並運行上述子類

MyThread mThread = new MyThread();
mThread.start();

2.實現Runnable接口

Step 1:新建一個實現java.lang.Runable接口的類的實例,實例中的方法可以被線程調用

public class MyRunnable implements Runable{
    public void run(){
        // to do something
    }
}

Steo 2:爲了執行run()方法,需要在Thread類的構造函數中傳入MyRunnable的實例對象

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

兩種方法都可以用匿名類的形式實現

Runnable myRunnable = new Runnable(){
   public void run(){
     System.out.println("Runnable running");
   }
}
Thread thread = new Thread(myRunnable);
thread.start();

創建子類還是實現Runnable接口?——No Answer

  1. 如果實現Runnable接口這種方法,因爲線程池可以有效的管理實現了Runnable接口的線程,如果線程池滿了,新的線程就會排隊等候執行,直到線程池空閒出來爲止
    而如果線程是通過實現Thread子類實現的,這將會複雜一些
  2. 有時我們要同時融合實現Runnable接口和Thread子類兩種方式。例如,實現了Thread子類的實例可以執行多個實現了Runnable接口的線程。一個典型的應用就是線程池。

常見錯誤:調用run()方法而非start()方法

創建並運行一個線程所犯的常見錯誤是調用線程的run()方法而非start()方法,如下所示:

Thread newThread = new Thread(MyRunnable());
newThread.run();  //should be start();

起初你並不會感覺到有什麼不妥,因爲run()方法的確如你所願的被調用了。但是,事實上,run()方法並非是由剛創建的新線程所執行的,而是被創建新線程的當前線程所執行了。也就是被執行上面兩行代碼的線程所執行的。想要讓創建的新線程執行run()方法,必須調用新線程的start方法。

其實,很顯然,使用run()的調用,它只不過是在本線程中調用了該類內的方法罷了

線程名

創建一個線程的時候,可以給線程起一個名字。它有助於我們區分不同線程

MyRunnable runnable = new MyRunnable();
Thread thread = new Thread(runnable, "Name A");
thread.start();
System.out.println(thread.getNaem());

另外,MyRunnable並非Thread的子類,所以它沒有getName()方法。可以通過如下代碼獲得當前線程的名字:

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

簡單的一個示例

public class TryThread {
    public static void main(String args[]){
        System.out.println(Thread.currentThread().getName());
        for(int i=0; i<10; i++){
            new Thread("" + i){
                @Override
                public void run() {
                    System.out.println("Thread:" + getName() + "running");
                }
            }.start();
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章