博客 / 詳情

返回

java lambda表達式 回調函數

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());
            });
        }
    }
}
user avatar icecreamlj 頭像 an_653b347d1d3da 頭像 nanian_5cd6881d3cc98 頭像 lesini 頭像 dashnowords 頭像 tofrankie 頭像 async_wait 頭像 air_clou_d 頭像 wenjinhua 頭像 user_kim 頭像 zisrfs 頭像 series_611f64675e99f 頭像
12 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.