採用繼承Thead類別實作多執行緒:
優點:編寫簡單,如果需要存取當前線程,只需使用this即可,無需使用Thead.currentThread()方法。
劣勢:因為這種執行緒類別已經繼承了Thead類,所以不能再繼承其它類別。
範例程式碼:
複製代碼代碼如下:
package org.frzh.thread;
public class FirstThread extends Thread{
private int i;
//重寫run方法,run方法的方法體就是執行緒執行體
public void run() {
for (; i < 100; i++) {
//當執行緒類別繼承Thread類別時,可以直接呼叫getName方法來取得目前執行緒名
//如果想獲得當前線程,直接使用this
//Thread物件的getName方法傳回目前執行緒的名字
System.out.println(getName() + " " + i);
}
}
public static void main(String[] args) {
for (int i = 0; i < 100; i++) {
//呼叫Thead的currentThread方法取得目前執行緒
System.out.println(Thread.currentThread().getName() + " " +i);
if (i == 20) {
new FirstThread().start();
new FirstThread().start();
}
}
}
}
運行結果片段:
我們發現,在兩個子線程中i的值並不連續,似乎與我們說的子線程直接共享資料不符。其實,在這裡我們實例化了兩個子線程,每個都擁有自己的實例變數i。
採用實作Runable介面的多執行緒:
優勢:線程類別只是實作了Runable接口,因此還可以繼承其他類別;
在這種情況下,可以使多個執行緒共享一個target對象,所以非常適合多個執行緒用來處理同一份資源的情況,從而可以將cpu、程式碼和資料分開,形成清晰的模型,較好的體現面向對象思想。
劣勢:程式設計略有些複雜,如果要存取目前執行緒必須使用Thread.currentThread方法。
範例程式碼:
複製代碼代碼如下:
package org.frzh.thread;
public class SecondThread implements Runnable{
private int i;
@Override
public void run() {
// TODO Auto-generated method stub
for (; i < 100; i++) {
System.out.println(Thread.currentThread().getName() + " " + i);
}
}
public static void main(String[] args) {
for (int i = 0; i < 100; i++) {
System.out.println(Thread.currentThread().getName() + " " + i);
if (i == 20) {
SecondThread st = new SecondThread();
new Thread(st, "子執行緒1").start();
new Thread(st, "子執行緒2").start();
}
}
}
}
運行結果片段:
可以看到,此時的i值是連續變化的,因為線程1和2共享同一個target。