Java學習之多執行緒、內部類
內部類:
定義在類中的類,成為內部類。
好處是可以直接訪問外部類中的成員(包括私有)。
外部類想訪問內部類需要建立內部類物件。
匿名內部類:就是內部類的簡化格式。
內部類必須繼承一個類或者實現介面,這種情況下的內部類可以簡化成匿名內部類。
格式: new 父類或者介面 () {定義子類的內容}
匿名內部類就是一個子類物件。
多執行緒
執行緒和程序:
程序:一個正在執行的程式就是一個程序。
執行緒:一個程序中有很多個執行緒。(每一個執行緒相當於一個執行的任務)
開啟一個執行緒 相當於開啟了一個CPU的執行路徑(相對獨立)。
CPU在執行多個執行緒的時候是隨機的,跟執行緒的優先順序有關。執行緒的排程採用分時排程,CPU會在多個執行緒中進行隨機切換,優先順序相同,時間片相同。
單執行緒程式:
特點:程式由上至下依次執行。(一個執行完,才會執行下一個)
好處:資料絕對安全,不牽扯到操作共享資料。
弊端:效率不高。
主執行緒
多執行緒的程式,除了主執行緒外,一般都叫子執行緒。
一個程式只有一個主執行緒。
main函式就是一個執行緒,並且是主執行緒。
主執行緒(main函式)是如何被執行的
JVM呼叫main函式 --> CPU為main函式開闢了一個執行路徑 --> 相當於在這個執行路徑中,執行main函式中的程式碼。
Thread執行緒類(開闢一個主執行緒以外的子執行緒)
1.建立Thread類的子類;
2.重寫run方法(run方法中是執行緒要執行的程式碼);
3.呼叫start方法,開啟執行緒(執行緒不能重複開啟)。
執行緒的建立:
方式1:
class MyThread extends Thread{ public MyThread() { } public MyThread(String name) { super(name); } @Override public void run() { } }
繼承Thread類,後在main函式中宣告子類的物件。
方式2:使用介面的方式來建立
class RunnableImpl implements Runnable{
@Override
public void run() {
}
}
RunnableImpl runnableImpl = new RunnableImpl();
// 建立一個執行緒類物件
Thread thread = new Thread(runnableImpl);
// 開啟執行緒
thread.start();
方式3:用Thread的匿名內部類
Thread thread = new Thread() {
public void run() {
System.out.println("子執行緒執行的方法");
};
};
thread.start();
方式4:用Runnable介面的匿名內部類
Runnable runnable = new Runnable() {
@Override
public void run() {
System.out.println("介面實現類的方法");
}
};
Thread thread2 = new Thread(runnable);
thread2.start();
執行緒名稱的獲取
在一般的執行緒中,名稱可以通過get方法獲取。但是主執行緒無法通過此方法獲取,所以獲取名稱一般使用:
Thread.currentThread();方法,此方法可以獲取當前正在執行的執行緒。
注意:由於Thread類中的set/get方法是由final修飾的,當想給Thread子類新增成員變數時,需注意提供set/get方法時,需要改名。
建立了一個執行緒,相當於CPU開闢了一個獨立的執行路徑。相當於開闢了一個獨立的方法棧來專門執行子執行緒中的方法。
執行緒在記憶體中的表現圖:
執行緒狀態(6種)