背景 在測試環境上遇到一個詭異的問題,部分業務邏輯會記錄用戶ID到資料庫,但記錄的數據會串,比如當前用戶的操作記錄會被其他用戶覆蓋, 而且這個現象是每次重啟後一小段時間內就正常 問題 線上程池內部使用了InheritableThreadLocal獲取用戶信息由於沒有及時remove,線程復用後,拿到 ...
當:
1、成員方法或構造方法中的形參是介面(Interface)
2、該介面為函數式介面,即抽象方法只有一個
在方法實現的時候可以採用的方式有:
1、傳統的方式實現(也適用於非函數式介面)
創建該介面的匿名內部類並重寫介面方法
//方式一
Thread lambda1 = new Thread(new Runnable() {
@Override
public void run() {
RunnableImpl r1 = new RunnableImpl();
r1.sellTick();
}
}
);
2、lambda表達式
使用lambda表達式要點即 採用()->{} 的方式,註意對lambda表達式簡化後的理解
//方式二
Thread lambda2 = new Thread(() -> {
r1.sellTick();
}
);
//方式二改寫
Thread lambda3 = new Thread(() -> r1.sellTick());
3、使用方法引用
前提是有一個已經實現的方法,且該方法滿足介面抽象方法的形參和返回值。可以採用方法引用的方式傳入介面,極大簡化代碼
//方式三
Thread thread = new Thread(new RunnableImpl()::sellTick);
總結:無論是Lambda還是方法引用,核心就是必須滿足介面方法中的形參和返回值。
註意:採用方法引用的時候,介面方法無返回值,則方法引用中有無返回值都可以實現編譯執行;