當sex欄位是int或者char型別,select * from user where sex=1這種會走索引嗎?
阿新 • • 發佈:2020-09-19
執行緒狀態:分為6種情況
導致狀態發生條件 | |
---|---|
NEW(新建) | 執行緒剛被建立,但是並未啟動。還沒呼叫start方法。MyThread t = new MyThread()只有執行緒物件,沒有執行緒特徵。建立執行緒物件時 |
Runnable(可執行) | 執行緒可以在java虛擬機器中執行的狀態,可能正在執行自己程式碼,也可能沒有,這取決於作業系統處理器。呼叫了t.start()方法 :就緒(經典教法)。呼叫start方法時 |
Blocked(鎖阻塞) | 當一個執行緒試圖獲取一個物件鎖,而該物件鎖被其他的執行緒持有,則該執行緒進入Blocked狀態;當該執行緒持有鎖時,該執行緒將變成Runnable狀態。等待鎖物件時 |
Waiting(無限等待) | 一個執行緒在等待另一個執行緒執行一個(喚醒)動作時,該執行緒進入Waiting狀態。進入這個狀態後是不能自動喚醒的,必須等待另一個執行緒呼叫notify或者notifyAll方法才能夠喚醒。呼叫wait()方法時 |
Timed Waiting(計時等待) | 同waiting狀態,有幾個方法有超時引數,呼叫他們將進入Timed Waiting狀態。這一狀態將一直保持到超時期滿或者接收到喚醒通知。帶有超時引數的常用方法有Thread.sleep (毫秒值)、Object.wait。呼叫sleep()方法時 |
Teminated(被終止) | 因為run方法正常退出而死亡,或者因為沒有捕獲的異常終止了run方法而死亡。 |
圖解:
等待喚醒機制:(用於有效利用資源)
wait/notify就是執行緒間的一種協作機制
- 必須使用鎖物件呼叫wait方法,讓當前執行緒進入無線等待狀態
- 必須使用鎖物件呼叫notify\notifyAll方法喚醒等待執行緒
- 呼叫wait\nottifi\notifiAll方法的鎖物件必須一致
分析的觀點喚醒機制程式:
- 執行緒的排程還是搶佔式
- 執行緒進入無線等待狀態,就不會霸佔cpu和鎖物件(釋放),也不會搶佔cpu和鎖物件
- 如果是在同步鎖\Lock鎖中,呼叫sleep方法進入計時等待,不會釋放cpu和鎖物件(依然佔有,裝睡)
寫程式碼四步:確認幾條執行緒,確認鎖物件,確認等待機制,確認喚醒機制
注意:無論是定義wait還是notify\notifyAll的使用都必須在有鎖物件的情況下
Lambda表示式:
不通過物件的方式,使用函數語言程式設計思想,直接執行任務,不依靠物件---強調做什麼,而不是以什麼形式
函式程式設計的格式(引數型別 引數名,引數型別,引數名)—>{ 程式碼語句};()-->
- 小括號當中的引數,傳遞給大括號中使用
- 小括號的引數要和介面中的抽象方法列表一致,無參則留空,多個引數用逗號隔開
作用:簡化程式碼
使用條件:
- 當且僅當介面中只有一個抽象方法的介面,才可以使用Lambda表示式替換其實現類
- 介面中只有一個抽象方法的介面,叫做函式式介面
- 如果式函式式介面,那麼就可以使用@FunctionalInterface
使用Lombda表示式:
- 判斷介面是否式函式時介面
- 如果是函式式介面,那麼直接寫()-->{ }
- 然後填充(){ }
省略格式:
- 小括號中的形參型別可以省略
- 如果小括號中只有一個引數,那麼小括號和形參型別可以一起省略
- 如果大括號中只有一條語句,那麼大括號,分號,return可以一起省略
使用場景:
- 變數的形式
- 引數的形式
- 返回值的形式
Stream流:
package zw.Demo02Stream流; import java.util.ArrayList; import java.util.List; import java.util.Set; import java.util.stream.Collectors; import java.util.stream.Stream; /** * zw * https://www.cnblogs.com/YwhsR0129/ * 2020/9/19,19:17 */ /* * 1. 第一個隊伍只要名字為3個字的成員姓名; 2. 第一個隊伍篩選之後只要前3個人; 3. 第二個隊伍只要姓張的成員姓名; 4. 第二個隊伍篩選之後不要前2個人; 5. 將兩個隊伍合併為一個隊伍; 6. 根據姓名建立`Person`物件; 7. 列印整個隊伍的Person物件資訊。 * */ public class Test { public static void main(String[] args) { List<String> one = new ArrayList<>(); one.add("迪麗熱巴"); one.add("宋遠橋"); one.add("蘇星河"); one.add("老子"); one.add("莊子"); one.add("孫子"); one.add("洪七公"); List<String> two = new ArrayList<>(); two.add("古力娜扎"); two.add("張無忌"); two.add("張三丰"); two.add("趙麗穎"); two.add("張二狗"); two.add("張天愛"); two.add("張三"); //1. 第一個隊伍只要名字為3個字的成員姓名; //2. 第一個隊伍篩選之後只要前3個人; Stream<String> limit1 = one.stream().filter(name -> name.length() == 3).limit(3); //3. 第二個隊伍只要姓張的成員姓名; //4. 第二個隊伍篩選之後不要前2個人; Stream<String> limit2 = two.stream().filter(name -> name.startsWith("張")).skip(2); //5. 將兩個隊伍合併為一個隊伍; //6. 根據姓名建立`Person`物件; //7. 列印整個隊伍的Person物件資訊。 Stream<Person> personStream = Stream.concat(limit1, limit2).map(name -> new Person(name)); Set<Person> collect = personStream.collect(Collectors.toSet()); System.out.println(collect); } }