天天看點

等待與喚醒 線程池 Lambda表達式

等待喚醒機制就是用于解決線程間通信的問題的,使用到的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,分号必須一起省略