java使用lambda表達式做回調函數,定義一個interface寫一個方法即可(如果一個接口只有一個抽象方法(包括繼承的),該接口是一個函數接口,函數接口可以使用lambda表達式實現),lambda表達式函數內部可以獲取外部變量,會保存堆棧信息
源碼
Callback.java
public interface Callback{
void onCompletion();
}
Test.java
public class Test implements Runnable {
BlockingDeque<Callback> queue = new LinkedBlockingDeque<>();
void init(){
Thread thread = new Thread(this,"Test");
thread.start();
}
void sendAsync(Callback callback){
queue.add(callback);
}
@Override
public void run() {
while (true){
try {
Thread.sleep(10);
Callback callback = queue.take();
callback.onCompletion();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
TestObject.java
public class TestObject {
public String getVal() {
return val;
}
public void setVal(String val) {
this.val = val;
}
private String val;
}
Main.java
public class Main {
public static void main(String[] args) {
Test test = new Test();
test.init();
for(int i=0;i<10;i++){
String data = "i=" + i;
TestObject obj = new TestObject();
obj.setVal(data);
System.out.println("handle before" + obj + obj.getVal());
System.out.println(Thread.currentThread().getName());
test.sendAsync(()->{
System.out.println("handle"+obj + obj.getVal());
System.out.println(Thread.currentThread().getName());
});
}
}
}