一.進程和線程
進程:進程是資源分配的基本單位,每個進程都有自己獨立的內存空間,可以看作是一個正在運行的程序實例
線程:線程是CPU調度的基本單位,屬于進程,一個進程可以包含多個線程。線程共享進程的內存空間和資源,但每個線程有自己獨立的棧和寄存器
多進程:在操作系統中,同時運行多個程序
多進程的好處:可以充分利用CPU,提高CPU的使用率
多線程:在同一個進程(應用程序)中同時執行多個線程
多線程的好處:提高進程的執行使用率,提高了CPU的使用率
注意:
在同一個時間點一個CPU中只可能有一個線程在執行
多線程不能提高效率、反而會降低效率,但是可以提高CPU的使用率
一個進程如果有多條執行路徑,則稱為多線程程序
Java虛擬機的啟動至少開啟了兩條線程,主線程和垃圾回收線程
一個線程可以理解為進程的子任務
二.線程的實現方式
1.繼承Thread類
注意:
啟動線程是使用start方法而不是run方法
線程不能啟動多次,如果要創建多個線程,那么就需要創建多個Thread對象
class MyThread extends Thread {@Overridepublic void run() {System.out.println("Thread running by extending Thread class");}
}public class Main {public static void main(String[] args) {MyThread thread = new MyThread();thread.start();}
}
2.實現Runable接口
實現Runable接口的好處:
可以避免Java單繼承帶來的局限性
適合多個相同的程序代碼處理同一個資源的情況,把線程同程序的代碼和數據有效的分離,在實現解耦的同時,較好的體現了面向對象的設計思想
class MyRunnable implements Runnable {@Overridepublic void run() {System.out.println("Thread running by implementing Runnable interface");}
}public class Main {public static void main(String[] args) {Thread thread = new Thread(new MyRunnable());thread.start();}
}
3.實現Callable接口
前面兩種方式都是重寫run方法,而run方法沒有返回結果,也不能拋出異常,main方法不知道線程什么時候開啟和結束,也不知道返回值。
所以在jdk1.5引入實現Callable接口的方式創建線程,即可以獲取返回值,也可以拋出異常
import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;class MyCallable implements Callable<String> {@Overridepublic String call() throws Exception {return "Thread running by implementing Callable interface";}
}public class Main {public static void main(String[] args) throws Exception {FutureTask<String> futureTask = new FutureTask<>(new MyCallable());Thread thread = new Thread(futureTask);thread.start();System.out.println(futureTask.get());}
}