多線程理解 繼承Thread類 子類繼承Thread類具備多線程能力 啟動線程:子類對象.start() 不建議使用:避免oop單繼承局限性 實現Runnable介面 實現介面Runnable具有多線程能力 啟動線程:傳入目標對象+Thread對象.start() 推薦使用:避免單繼承局限性,可能一 ...
繼承Thread類
-
子類繼承Thread類具備多線程能力
-
啟動線程:子類對象.start()
-
不建議使用:避免oop單繼承局限性
實現Runnable介面
-
實現介面Runnable具有多線程能力
-
啟動線程:傳入目標對象+Thread對象.start()
-
推薦使用:避免單繼承局限性,可能一個對象被多個線程使用
多個線程同時操作同一個對象
問題:多個線程操作同一個資源,可能會出現資源衝突問題
實現Callable介面
-
實現Callable介面,需要返回值類型
-
重寫call方法,需要拋出異常
-
創建目標對象
-
創建執行服務
-
提交執行
-
獲取結果
-
關閉服務
抽象角色:聲明真實對象和代理對象的共同介面。
代理角色:代理對象角色內部含有對真實對象的引用,從而可以操作真實對象,同時代理對象提供與真實對象相同的介面以便在任何時刻都能夠代替真實對象。
同時,代理對象可以在執行真實對象操作時,附加其他的操作,相當於對真實對象進行封裝。
真實角色:代理角色所代表的真實對象,是我們最終要引用的對象。
Lamda表達式
學習前提:
為什麼使用
-
避免匿名內部類定義過多
-
可以使代碼更簡潔
-
去掉無意義代碼,留下核心邏輯
理解函數式介面
定義:只包含唯一一個抽象方法的介面,如:
public interface Runnable{
public abstract void run();
}
對於函數式介面,我們可以通過lamda表達式來創建該介面的對象。
推導邏輯:
package JavaText.Text;
public class LamdaTest {
//3.靜態內部類
static class like2 implements ILike{
public void lamda(){
System.out.println("I like lamda2");
}
}
public static void main(String[] args) {
ILike like = new like();
like.lamda();
like2 like2=new like2();
like2.lamda();
//4.局部內部類
class like3 implements ILike{
public void lamda(){
System.out.println("I like lamda3");
}
}
like = new like3();
like.lamda();
//5.匿名內部類,沒有類的名稱,必須藉助介面或父類
like =new ILike(){
@Override
public void lamda(){
System.out.println("I like lamda4");
}
};
like.lamda();
//6.lamda表達式
like=()->{
System.out.println("I like lamda5");
};
like.lamda();
}
}
//1.定義一個函數式介面
interface ILike{
void lamda();
}
//2.常用類
class like implements ILike{
public void lamda(){
System.out.println("I like lamda1");
}
}
Lamda表達式其實就是省略掉那些唯一不可變的東西,如在這一段代碼當中:
//5.匿名內部類,沒有類的名稱,必須藉助介面或父類
like =new ILike(){
@Override
public void lamda(){
System.out.println("I like lamda4");
}
};
like.lamda();
//6.lamda表達式
like=()->{
System.out.println("I like lamda5");
};
like.lamda();
----
new ILike(){
@Override
public void lamda(),括弧之前的代碼都是唯一不可變的,因此可以省略,而括弧之後的代碼是自己定義的因此保留括弧以後的代碼在加上->即可。