Java語言的JVM允許程式運作多個線程,它通過java.lang.Thread類來展現。
Thread類的特性
每個線程都是通過某個特定Thread對象的run()方法來完成操作的,經常把run()方法的主體稱為線程體,通過該Thread對象的start()方法來啟動這個線程,而非直接調用run()。
JDK1.5之前建立新執行線程有兩種方法:
①繼承Thread類的方式 (點選檢視Thread類相關常用的方法)
②實作Runnable接口的方式
方式一:繼承Thread類
①定義子類繼承Thread類。
②子類中重寫Thread類中的run方法。
③建立Thread子類對象,即建立了線程對象。
④調用線程對象start方法:啟動線程,調用run方法。
繼承Thread的子類MyThread
public class MyThread extends Thread{
@Override
public void run() { //該方法體即為該線程要執行的程式
for (int i = 0;i < 50;i++){
if (i % 2 == 0) System.out.println(i);
}
}
}
建立線程對象并執行
public class TestThread {
public static void main(String[] args) {
//建立線程
MyThread thread = new MyThread();
//啟動該線程,并執行run()方法
thread.start();
//以下是不同于thread的線程
for (int i = 0; i < 50; i++) {
if (i % 2 == 0) {
System.out.println(i + "#####");
}
}
}
}
結果(僅截取部分)
該結果随着計算機的不同會有不同的情況,不定。但要表達的意思就是多線程執行的情況下不同線程是并行的。
注意點:
①如果自己手動調用run()方法,那麼就隻是普通方法,沒有啟動多線程模式。
②run()方法由JVM調用,什麼時候調用,執行的過程控制都有作業系統的CPU排程決定。
③啟動多線程,必須通過調用start()方法。
④一個線程對象隻能調用一次start()方法啟動,如果重複調用了,則将抛出異常“IllegalThreadStateException”。
方式二:實作Runnable接口
①定義子類,實作Runnable接口。
②子類中重寫Runnable接口中的run方法。
③通過Thread類含參構造器建立線程對象。
④将Runnable接口的子類對象作為實際參數傳遞給Thread類的構造器中。
⑤調用Thread類的start方法:開啟線程,調用Runnable子類接口的run方法。
實作Runnable接口的類
public class MThread implements Runnable{
@Override
public void run() {
for (int i = 0; i < 100; i++) {
if (i % 2 == 0){
System.out.println(i);
}
}
}
}
建立對象并執行
public class TestThread {
public static void main(String[] args) {
MThread thread = new MThread();
Thread curThread = new Thread(thread);
curThread.start();
}
}
繼承方式和實作方式的聯系與差別
開發中:優先選擇:實作Runnable 接口的方式
原因:①實作的方式沒有類的單繼承性的局限性。②實作的方式更适合來處理多個線程有共享資料的情況。
聯系: public class Thread implements Runnable
相同點:兩種方式都需要重寫run(),将線程要執行的邏輯寫在在run()中。