目錄
- 內(nèi)部類與Lambda表達(dá)式
-
- 多線程
內(nèi)部類與Lambda表達(dá)式
內(nèi)部類
- 在一個類中定義另外一個類,這個類就叫做內(nèi)部類或內(nèi)置類 (inner class) 。
- 在main中直接訪問內(nèi)部類時,必須在內(nèi)部類名前冠以其所屬外部類的名字才能使用;在main中直接new一個內(nèi)部類對象時,也需在new前冠以外部類對象變量。例:
Zoo.Tiger t = z.new Tiger();
- 關(guān)于內(nèi)部類:
- 內(nèi)部類可以聲明為private或protected;還可以聲明為abstract或final。
- 內(nèi)部類可以聲明為static的,但此時就不能再使用外部類的非static的成員變量和非static的成員方法。
- 非static的內(nèi)部類中的成員不能聲明為static的,只有在頂層類或static的內(nèi)部類中才可聲明static成員。
- 內(nèi)部類可以是一個接口,該接口必須由另一個內(nèi)部類實現(xiàn)。
- 在方法中可以定義內(nèi)部類,但方法中的內(nèi)部類,如果要訪問方法中定義的本地變量或方法的參數(shù),則變量必須被聲明為final。
- 匿名內(nèi)部類:匿名內(nèi)部類不僅可以用在接口上,還能用在具體類、抽象類上,且對方法個數(shù)沒有要求。匿名內(nèi)部類一定是跟在new的后面,用其隱含實現(xiàn)一個接口或繼承一個類。因為沒有類名,所以根據(jù)多態(tài)性,我們使用其父類名或接口名。匿名內(nèi)部類是在接口及抽象類的基礎(chǔ)上發(fā)展起來的。使用匿名內(nèi)部類的前提必須繼承父類或?qū)崿F(xiàn)一個接口。注意:
- 匿名內(nèi)部類不能有構(gòu)造方法;
- 不能定義任何靜態(tài)成員、方法或類;
- 不能是public、protected、private、static;
- 只能創(chuàng)建匿名內(nèi)部類的一個實例。
interface A
{void print();
}
public class Test
{public static void func(A a){a.print();}public static void main(String args[]){func(new A(){public void print(){System.out.println("Hello");}});}
}
Lambda表達(dá)式
- 函數(shù)式接口是指:有且僅有一個抽象方法的接口,也稱為單抽象方法接口。
- Lambda表達(dá)式最直觀的作用就是使得代碼變得異常簡潔!
- 每一個Lambda表達(dá)式都對應(yīng)一個函數(shù)式接口,可以將Lambda表達(dá)式看作是實現(xiàn)函數(shù)式接口的匿名內(nèi)部類的一個對象。
- Lambda表達(dá)式通常由參數(shù)列表、箭頭和方法體三部分組成,其語法格式如下:
- (類型1 參數(shù)1,類型2 參數(shù)2,……)->{方法體}
- (參數(shù)1,參數(shù)2,……)->{方法體}
- Lambda表達(dá)式的語法格式:
- 語法格式一 :無參數(shù),無返回值。
() -> System.out.println(“Hello Lambda!”);
- 語法格式二 :有一個參數(shù),并且無返回值。
(x)->System.out.println(x);
- 語法格式三:有兩個以上的參數(shù),有返回值,并且 Lambda 體中有多條語句。
- 語法格式四:若 Lambda 體中只有一條語句, return和花括號都可以省略不寫。
Comparator com = (x, y) -> {
System.out.println(“函數(shù)式接口”);
return Integer.compare(x, y);
};
Comparator com = (x, y) -> Integer.compare(x, y);
多線程
- 基本概念:
- 程序(Program):程序是未在運行的代碼,程序是靜態(tài)的代碼。
- 進(jìn)程(Process):進(jìn)程是正在運行著的程序,進(jìn)程是動態(tài)的。同一個程序可以運行多個,一個進(jìn)程擁有一塊地址空間。進(jìn)程是系統(tǒng)運行程序的基本單位。
- 多任務(wù)(Multi task):多任務(wù)是指在一個系統(tǒng)中可以同時運行多個程序,即有多個獨立運行的任務(wù),每一個任務(wù)對應(yīng)一個進(jìn)程。
- 線程(Thread):線程是一個比進(jìn)程更小的執(zhí)行單位。一個進(jìn)程在其執(zhí)行過程中可以產(chǎn)生多個線程,形成多條執(zhí)行線路。
- 多線程(Multithread):一個進(jìn)程中同時存在幾個執(zhí)行體,按幾條不同的執(zhí)行路徑共同工作。一個進(jìn)程里的多個線程共同擁有一塊地址空間。每個線程運行時,操作系統(tǒng)會分配給它一個時間片。
- 線程的生命周期:
- 新建狀態(tài)(Newborn) new一個線程對象
- 就緒狀態(tài)(Runnable)
start()
方法啟動線程 - 運行狀態(tài)(Running)
run()
方法執(zhí)行線程 - 阻塞狀態(tài)(Blocked)
sleep()
,yield()
等方法 - 消亡狀態(tài)(Dead) 任務(wù)完成或被強行終止
- 線程的調(diào)度與優(yōu)先級:
- 調(diào)度:指在各個線程之間分配CPU資源。線程調(diào)度有兩種模型:分時模型和搶占模型。
- 分時調(diào)度模型:所有線程輪流使用 CPU ,平均分配每個線程占用 CPU 的時間片。
- 搶占式調(diào)度模型:優(yōu)先讓優(yōu)先級高的線程使用 CPU。如果線程的優(yōu)先級相同,那么會隨機選擇一個。優(yōu)先級高的線程獲取的 CPU 時間片相對多一些。(Java使用的是搶占式調(diào)度模型)
- Java中線程的優(yōu)先級從低到高以整數(shù)1~10表示,共分為10級。
MIN_PRIORITY
表示最小優(yōu)先級,通常為1;MAX_PRIORITY
表示最高優(yōu)先級,通常為10;NORM_PRIORITY
表示普通優(yōu)先級,缺省值為5。 - 新建線程將繼承創(chuàng)建它的父線程的優(yōu)先級。
- 一般情況下,主線程具有普通優(yōu)先級。
- Java中創(chuàng)建線程有兩種方式:
- 繼承java.lang包中的Thread類
- 在自己的類中實現(xiàn)Runnable接口
- 利用Thread類的子類來創(chuàng)建線程:
- 此類必須是繼承自Thread類;
- 線程所要執(zhí)行的代碼必須寫在run()方法內(nèi)。
class 類名 extends Thread
{類里的成員變量;類里的成員方法;修飾符 run() {線程的代碼}
}
- 用Runnable接口來創(chuàng)建線程:
- Runnable接口只有一個方法run(),我們可以定義一個類并實現(xiàn)Runnable接口,并重寫run()方法。
- Runnable接口并沒有任何對線程的支持,所以還必須創(chuàng)建Thread類的實例,并把我們自定義的線程類(例:MyThread)的對象(例:mt)作為參數(shù)傳遞給Thread類的構(gòu)造方法。