1. 程式人生 > 實用技巧 >當sex欄位是int或者char型別,select * from user where sex=1這種會走索引嗎?

當sex欄位是int或者char型別,select * from user where sex=1這種會走索引嗎?

執行緒狀態:分為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方法而死亡。run方法執行結束時

圖解:

等待喚醒機制:(用於有效利用資源)

wait/notify就是執行緒間的一種協作機制

  • 必須使用鎖物件呼叫wait方法,讓當前執行緒進入無線等待狀態
  • 必須使用鎖物件呼叫notify\notifyAll方法喚醒等待執行緒
  • 呼叫wait\nottifi\notifiAll方法的鎖物件必須一致

分析的觀點喚醒機制程式:

  • 執行緒的排程還是搶佔式
  • 執行緒進入無線等待狀態,就不會霸佔cpu和鎖物件(釋放),也不會搶佔cpu和鎖物件
  • 如果是在同步鎖\Lock鎖中,呼叫sleep方法進入計時等待,不會釋放cpu和鎖物件(依然佔有,裝睡)

寫程式碼四步:確認幾條執行緒,確認鎖物件,確認等待機制,確認喚醒機制

注意:無論是定義wait還是notify\notifyAll的使用都必須在有鎖物件的情況下

Lambda表示式:

不通過物件的方式,使用函數語言程式設計思想,直接執行任務,不依靠物件---強調做什麼,而不是以什麼形式

函式程式設計的格式(引數型別 引數名,引數型別,引數名)—>{ 程式碼語句};()-->

  1. 小括號當中的引數,傳遞給大括號中使用
  2. 小括號的引數要和介面中的抽象方法列表一致,無參則留空,多個引數用逗號隔開

作用:簡化程式碼

使用條件:

  • 當且僅當介面中只有一個抽象方法的介面,才可以使用Lambda表示式替換其實現類
  • 介面中只有一個抽象方法的介面,叫做函式式介面
  • 如果式函式式介面,那麼就可以使用@FunctionalInterface

使用Lombda表示式:

  1. 判斷介面是否式函式時介面
  2. 如果是函式式介面,那麼直接寫()-->{ }
  3. 然後填充(){ }

省略格式:

  1. 小括號中的形參型別可以省略
  2. 如果小括號中只有一個引數,那麼小括號和形參型別可以一起省略
  3. 如果大括號中只有一條語句,那麼大括號,分號,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);

    }


}