vue的原生事件繫結流程
-
建立執行緒方式1:繼承Thread類,重寫run()方法,呼叫start開啟執行緒
-
建立執行緒方式2:實現runnable介面,重寫run方法,執行執行緒需要丟入runnable介面實現類,呼叫start方法
-
注意:執行緒開啟不一定立即執行,由CPU排程執行
Thread.start()執行緒開啟
Thread.sleep(100) 模擬延時
Thread.currentThread().getName() 當前執行緒
靜態代理
真實物件和代理物件都要實現同一個介面
代理物件要代理真實角色
好處
代理物件可以做很多真實物件做不了得事情
lambda表示式
-
理解Functional interface(函式式介面) 是學習java8 lambda表示式的關鍵所在。
-
為什麼要使用lmabda表示式
-
避免匿名內部類定義過多
-
可以讓你的程式碼看起來很簡潔
-
-
函式式介面的定義
-
任何介面,如果只包含唯一一個抽象方法,那麼它就是一個函式式介面
-
對於函式式介面,我們可以通過lambda表示式來建立該介面的物件
-
-
labda表示式總結:
-
lambda表示式只能有一行程式碼的情況下才能簡化成為一行,如果有多行,那麼就用程式碼快包裹
-
前提是介面為函式式介面
-
多個引數化也可以去掉引數型別,要去掉就都去掉,必須加上括號
-
執行緒休眠
-
sleep(時間)指定當前執行緒阻塞的毫秒數;
-
sleep存在異常InterruptedException;
-
sleep時間達到後執行緒進入就緒狀態;
-
sleep可以模擬網路延時,倒計時等
-
每一個物件都有一把鎖,sleep不會釋放鎖
執行緒禮讓
Thread.yield();
當執行緒執行的時候碰到Thread.yield();就會先退出來進入就緒狀態,讓另一個執行緒先跑。
注意:禮讓有時候不一定能成功,看CPU心情
Join
-
join合併執行緒,待此執行緒執行完成後,在執行其他執行緒,其他執行緒阻塞
執行緒的狀態
new - 就緒狀態 - 阻塞狀態 或者 執行狀態 - dead 有五個狀態
執行緒中斷或者結束,一旦進入死亡狀態,就不能再次啟動
執行緒優先順序
-
現成的優先順序用數字表示,範圍從1-10,預設是5
-
//放置優先權
.setPriority(3)
// 表示最大的 10
.setPriority(Thread.MAX_PRIORITY);
//表示最小的1
setPriority(Thread.MIN_PRIORITY); -
//得到優先權,可以顯示出幾級
Thread.currentThread().getPriority()
-
-
注意
-
優先順序低只是意味著獲得排程的概率低,並不是優先順序低就不會被呼叫了,這都是看CPU的排程
-
守護執行緒
-
執行緒分為使用者執行緒和守護執行緒
-
虛擬機器必須確保使用者執行緒執行完畢
-
虛擬機器不用等待守護執行緒執行完畢
//守護執行緒
.setDaemon(true);
執行緒同步
-
由於同一程序的多個執行緒共享同一塊儲存空間,在帶來方便的同時,也帶來了訪問衝突問題,為了保證資料在方法中被訪問時的正確性,在訪問時加入鎖機制 synchronized,當一個執行緒獲得物件的排他鎖,獨佔資源,其他執行緒必須等待,使用後釋放鎖即可,存在以下問題:
-
一個執行緒持有鎖會導致其他所有需要此鎖的執行緒掛起;
-
在多執行緒競爭下,加鎖,釋放鎖會導致比較多的上下文切換和排程延時,引起效能問題;
-
如果一個優先順序高的執行緒等待一個優先順序低的執行緒釋放鎖 會導致優先順序倒置,引起效能問題。
-
-
synchronized 同步方法 鎖的物件就是變化的量,需要增刪改的物件
同步塊
死鎖
-
多個執行緒各自佔有一些共享資源,並且互相等待其他執行緒佔有的資源才能執行,而導致兩個或則多個執行緒都在等待對方釋放資源,都停止執行的情形。某一個同步塊同時擁有“兩個以上物件的鎖”時,就不會發生“死鎖”的問題
死鎖避免方法
-
產生死鎖的四個必要條件:
-
互斥條件:一個資源每次只能被一個程序使用。
-
請求與保持條件:一個程序因請求資源而阻塞時,對已獲得的資源保持不放。
-
不剝奪條件:程序以獲得的資源,在未使用完之前,不能強行剝奪。
-
迴圈等待條件:若干程序之間形成一種頭尾相接的迴圈等待資源關係。
上列出了死鎖的4個必要條件,只要破其中一個或多個就可以避免死鎖發生
-
執行緒通訊
wait() :表示執行緒一直等待,直到其他執行緒通知,與sleep不同,會釋放鎖
notifyAll() :喚醒同一個物件上所有呼叫wait()方法的執行緒,優先級別高的執行緒優先排程
執行緒池
-
好處:
-
提高響應速度(減少了建立新執行緒的時間)
-
降低資源消耗(重複利用執行緒池中執行緒,不需要每次都建立)
-
便於縣執行緒管理
使用執行緒池
-
ExecutorService:真正的執行緒池介面。常見子類ThreadPoolExecutor
-
void execute(Runnable command):執行任務/命令,沒有返回值,一般用來執行Runnable
-
<T>Future<T>submit(Callable<T>task):執行任務,有返回值,一般用來執行Callable
-
void shutdown():關閉執行緒池
-
-
Executors:工具類、執行緒池的工廠類,用於建立並返回不同型別的執行緒池
//執行緒池
public class Test13 {
public static void main(String[] args) {
//1.建立服務,建立執行緒池
//.newFixedThreadPool(10); 引數為執行緒池的大小
ExecutorService service = Executors.newFixedThreadPool(10);
//執行緒池啟動服務
service.execute(new MyThread());
service.execute(new MyThread());
//2.關閉連結
service.shutdown();
}
}
class MyThread implements Runnable{
-