線程與程序
- 程序:是指一個記憶體中運作的應用程式,每個程序都有一個獨立的記憶體空間,一個應用程式可以同時運作多個程序;程序也是程式的一次執行過程,是系統運作程式的基本機關;系統運作一個程式即是一個程序從建立、運作到消亡的過程。
-
線程:線程是程序中的一個執行單元,負責目前程序中程式的執行,一個程序中至少有一個線程。一個程序中是可以有多個線程的,這個應用程式也可以稱之為多線程程式。
簡而言之:一個程式運作後至少有一個程序,一個程序中可以包含多個線程
建立線程類方式一(繼承Thread類)
Java使用
java.lang.Thread
類代表線程,所有的線程對象都必須是Thread類或其子類的執行個體。每個線程的作用是完成一定的任務,實際上就是執行一段程式流即一段順序執行的代碼。Java使用線程執行體來代表這段程式流。Java中通過
繼承Thread類來
建立并啟動多線程**的步驟如下:
- 定義Thread類的子類,并重寫該類的run()方法,該run()方法的方法體就代表了線程需要完成的任務,是以把run()方法稱為線程執行體。
- 建立Thread子類的執行個體,即建立了線程對象
- 調用線程對象的start()方法來啟動該線程
public class test {
public static class MyThread extends Thread{
public MyThread(String name){
//
super(name);
}
/*
* 重寫父類run方法
* 定義線程要執行的方法
* */
public void run(){
for (int i = 0; i < 20; i++) {
//拿到姓名
System.out.println(getName()+i);
}
}
}
public static void main(String[] args) {
System.out.println("這是主線程");
MyThread thread = new MyThread("小強");
//開啟新的線程
thread.start();
for (int i = 0; i < 20; i++) {
System.out.println("旺财"+i);
}
}
}

執行的流程題:
多線程執行時,到底在記憶體中是如何運作的呢?以上個程式為例,進行圖解說明:
多線程執行時,在棧記憶體中,其實每一個執行線程都有一片自己所屬的棧記憶體空間。進行方法的壓棧和彈棧
當執行線程的任務結束了,線程自動在棧記憶體中釋放了。但是當所有的執行線程都結束了,那麼程序就結束了
Thread類
建立線程方式二(實作Runnable接口)
- 定義Runnable接口的實作類,并重寫該接口的run()方法,該run()方法的方法體同樣是該線程的線程執行體。
-
建立Runnable實作類的執行個體,并以此執行個體作為Thread的target來建立Thread對象,該Thread對象才是真正
的線程對象。
- 調用線程對象的start()方法來啟動線程
public class MyRunnable implements Runnable{
@Override
public void run() {
for (int i = 0; i < 20; i++) {
System.out.println(Thread.currentThread().getName()+" "+i);
}
}
}
public class Demo {
public static void main(String[] args) {
//建立自定義類對象 線程任務對象
MyRunnable mr = new MyRunnable();
//建立線程對象
Thread t = new Thread(mr, "小強");
t.start();
for (int i = 0; i < 20; i++) {
System.out.println("旺财 " + i);
}
}
}
實作Runnable接口比繼承Thread類所具有的優勢:
- 适合多個相同的程式代碼的線程去共享同一個資源。
- 可以避免java中的單繼承的局限性。
- 增加程式的健壯性,實作解耦操作,代碼可以被多個線程共享,代碼和線程獨立。
- 線程池隻能放入實作Runable或Callable類線程,不能直接放入繼承Thread的類