等待喚醒機制就是用于解決線程間通信的問題的,使用到的3個方法的含義如下:
1. wait:線程不再活動,不再參與排程,進入 wait set 中,是以不會浪費 CPU 資源,也不會去競争鎖了,這時的線程狀态WAITING。它還要等着别的線程執行一個特别的動作,也即是“通知(notify)”在這個對象上等待的線程從wait set 中釋放出來,重新入到排程隊列(ready queue)中
2. notify:則選取所通知對象的 wait set 中的一個線程釋放;例如,餐館有空位置後,等候就餐最久的顧客最先入座
3. notifyAll:則釋放所通知對象的 wait set 上的全部線程
總結:
如果能擷取鎖,線程就從 WAITING 狀态變成 RUNNABLE 狀态;
否則,從 wait set 出來,又進入 entry set,線程就從 WAITING 狀态又變成 BLOCKED 狀态
目錄
線程池
Lambda表達式
線程池
JDK1.5之後提供的
java.util.concurrent.Executor :線程池的工廠類,用來生成線程池
Executor類中的靜态方法:
public static ExecutorService newFixedThreadPool(int nThreads) :傳回線程池對象。(建立的是有界線程池,也就是池中的線程個數可以指定最大數量)
參數:
int nThreads 建立線程池中包含的線程數量
傳回值:
ExecutroService接口,傳回的是ExecutorService接口的實作類對象,我們可以使用ExecutorService接口接收(面向接口程式設計)
java.util.concurrent.ExecutorService:線程池接口
用來從線程池中擷取線程,調用start方法,執行線程任務
submit(Runnable task) 送出一個Runnable 任務用于執行
關閉/銷毀線程池的方法:
void shutdown( )
線程池使用步驟:
1. 使用線程池的工廠類Executors裡面提供的靜态方法newFixedThreadPool生成一個指定線程數量的線程池
2. 建立一個類,實作Runnable接口,重寫run方法,設定線程任務
3. 調用ExecutorService中的方法submit,傳遞線程任務(實作類),開啟線程,執行run方法
4. 調用ExecutorService中的方法shutdown銷毀線程池 (不建議執行)
代碼:
Runnable實作類
public class MyRunnable implements Runnable {
@Override
public void run() {
System.out.println("我要一個教練");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("教練來了: " + Thread.currentThread().getName());
System.out.println("教我遊泳,交完後,教練回到了遊泳池");
線程池測試類
public class ThreadPoolDemo {
public static void main(String[] args) {
// 建立線程池對象
ExecutorService service = Executors.newFixedThreadPool(2);//包含2個線程對象
// 建立Runnable執行個體對象
MyRunnable r = new MyRunnable();
//自己建立線程對象的方式
// Thread t = new Thread(r);
// t.start(); ‐‐‐> 調用MyRunnable中的run()
// 從線程池中擷取線程對象,然後調用MyRunnable中的run()
service.submit(r);
// 再擷取個線程對象,調用MyRunnable中的run()
service.submit(r);
service.submit(r);
// 注意:submit方法調用結束後,程式并不終止,是因為線程池控制了線程的關閉。
// 将使用完的線程又歸還到了線程池中
// 關閉線程池
//service.shutdown();
}
}
ps.線程池會一直開啟,使用完了線程,會自動把線程歸還給線程池,線程可以繼續使用
Lambda表達式
面向對象的思想:
做一件事,找一個能解決這個事情的對象,調用對象的方法,完成
函數式程式設計思想:
隻要能擷取到結果,誰去做、怎麼做都不重要,重視的是結果,不重視過程
Lambda表達式格式由3個部分組成:
一些參數、一個箭頭、一段代碼
Lambda表達式的标準格式為:(參數類型 參數名稱) ‐> { 代碼語句 }
解釋說明格式:
( ):接口中抽象方法的參數清單,沒有參數就空着;有參數就寫出參數,多個參數使用逗号分隔
->:傳遞的意思,把參數傳遞給方法體()
{ }:重寫接口的抽象方法的方法體
Lambda表達式:是可推導,可省略的
凡是根據上下文推導出來的東西,都可以書寫
可以省略的内容:
1.(參數清單):括号中參數清單的資料類型,可以省略不寫
2.(參數清單):括号中的參數如果隻有一個,那麼類型和()都可以省略
3.(一些代碼):如果{}中的代碼隻有一行,無論是否有傳回值,都可以省略( {},return,分号)
注意:要省略{},return,分号必須一起省略