Java高級學習-線程池和Lambda表達式
線程池
線程通信,避免多線程對同一共享變量的爭奪。
等待與喚醒機制,wait – notify
wait-- notify 必須由同一個鎖對象調用
wait-- notify 屬于Object類的方法
wait-- notify 必須要在同步代碼塊或者同步函數中使用
等待與喚醒機制
線程復用,讓線程完成任務之后再繼續進行其他任務。
線程池:容器—>集合(ArrayList,HashSet,LinkedList,HashMap)
創建多個線程時,保存到一個集合中,使用線程時候,將線程沖集合中取出來。
List集合:Thread t = list.remove(0) :返回的時被移除的元素(線程只能被一個任務使用)。
LinkedList集合:Thread t = linked.removeFirst();
使用完線程,將線程歸還 : list.add(t) linked(t)
JDK1.5之后有內置線程,直接使用
java.util.concurrent.Executors:線程工廠類,用來生成線程池
Executors類中的方法:static ExecutorService newFixedThreadPool( int nThreads ):創建一個可重用的固定線程數的線程池。
nThreads :線程數量
返回值:ExecutorService接口,返回的是ExecutorService的實現類,可以使用ExecutorService接口接收(面向接口編程)
java.util.concurrent.ExecutorService:線程池接口,繼承了Executor接口(注意區分Executor接口和Executors工廠類)
從線程池獲取線程,調用start方法,執行線程任務。
提交Runnable任務用于執行:submit( Runnable task )
銷毀線程池:void shutdown( )
步驟:
newFixedThreadPool生成線程池
ExecutorService es = Executors.newFixedThreadPool( 2 );
創建一個Runnable的實現類,重寫run方法,設置線程任務
使用submit方法,傳遞線程任務(實現類),開啟線程,執行run方法
es.submit(new Runnable的實現類名); //匿名對象
shutdown銷毀線程池,不建議執行
Lambda表達式
面向對象思想:做一件事情,找到一個解決這個事情的對象,調用對象的方法,完成事情。
函數式編程思想:只關心結果,不關心過程
匿名內部類:new Thread( new Runable( ) { @Override pubilc void run**( )** { XXX } } ).start( );
Lambda表達式:new Thread( ( ) -> { XXX } ).start( );
小括號就是run方法的參數(無);小箭頭代表將參數傳遞到后面的代碼;后面的輸出語句為業務邏輯代碼。
簡化匿名內部類
( 參數列表 ) -> { 重寫方法的代碼 }
( ) :接口中抽象方法的參數列表,多個參數使用逗號分隔
{ } : 重寫接口中抽象方法的方法體
Lambda表達式:可推導,可省略
(參數列表):參數列表的數據類型,可以省略不寫
(參數列表):參數列表的參數只有一個,類型和()都可以省略
(一些代碼):如果{ } 中的代碼只有一行,無論是否有返回值,都可以省略 ( {},return,分號),要一起省略。
使用Lambda表達式必須具有接口,且接口中只有一個抽象方法。例如:Runnable,Comparator
Lambda表達式必須有上下文推斷。方法的參數或者局部變量類型必須為Lambda對應的接口類型,才能使用Lambda作為該接口實例
Java 任務調度
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。