如何寫一個 線程程式:
方式一:
1)寫一個類繼承Thread類,重寫run()方法
2)建立這個類的對象,調用start()
代碼:
MyThread--->提供一個構造方法調用父類的構造方法 為了是給線程提供一個名字!
package cn.itcast.thread;
public class MyThread extends Thread{
private String name;
public MyThread(String name){//通過構造方法的方式來為線程傳遞名臣
super(name);
}
@Override
public void run() {
for(int i=0;i<100;i++){
System.out.println(getName()+":"+i);
}
}
}
測試類:
package cn.itcast.thread;
public class MyThreadTest {
public static void main(String[] args) {
MyThread my1=new MyThread("李衛康");
MyThread my2=new MyThread("韓玮");
my1.start();
my1.setName("王超");///設定線程的名字
my2.start();
System.out.println(Thread.currentThread().getName());
}
}
方式二:
1)寫一個類實作runable接口
2)建立一個Thread對象傳入剛才寫好的類
3)調用start方法
代碼:
MyRunable
package cn.itcast.runable;
public class MyRunable implements Runnable{
@Override
public void run() {
for(int i=0;i<10;i++){
System.out.println(Thread.currentThread().getName()+":"+i);
}
}
}
MyRunableTest
package cn.itcast.runable;
public class MyRunableTest {
public static void main(String[] args) {
MyRunable my=new MyRunable();
Thread t1=new Thread(my);
t1.start();
}
}
解釋:線程的執行流程是怎麼樣的?

面試題:
調用線程類的run方法和執行start方法有什麼差別?
Start:
用start方法來啟動線程,真正實作了多線程運作,這時無需等待run方法體代碼執行完畢而直接繼續執行下面的代碼。通過調用Thread類的start()方法來啟動一個線程,這時此線程處于就緒(可運作)狀态,并沒有運作,一旦得到spu時間片,就開始執行run()方法,這裡方法run()稱為線程體,它包含了要執行的這個線程的内容,Run方法運作結束,此線程随即終止。
Run:
run()方法隻是類的一個普通方法而已,如果直接調用Run方法,程式中依然隻有主線程這一個線程,其程式執行路徑還是隻有一條,還是要順序執行,還是要等待run方法體執行完畢後才可繼續執行下面的代碼,這樣就沒有達到寫線程的目的。
總結:調用start方法方可啟動線程,而run方法隻是thread的一個普通方法調用,還是在主線程裡執行。