創建並運行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
- 如果實現Runnable接口這種方法,因爲線程池可以有效的管理實現了Runnable接口的線程,如果線程池滿了,新的線程就會排隊等候執行,直到線程池空閒出來爲止
而如果線程是通過實現Thread子類實現的,這將會複雜一些 - 有時我們要同時融合實現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();
}
}
}