java異步實現
一、同步和異步解釋
二、定義回調接口
三、定義異步實現類
四、測試類
一、同步和異步解釋
同步:就是在發出一個功能調用時,在沒有得到結果之前,該調用就不返回。
也就是說代碼從頭到尾執行,前面的代碼沒執行完後面的無法執行。
例如:一條水管,水管內有東西塞住,就會無法通水,或水流很慢。
所以同步會出現卡頓現象。
異步:異步與同步相對,當一個異步過程調用發出後,調用者在沒有得到結果之前,
就可以繼續執行後續操作。
也就是說無論異步方法執行代碼需要多長時間,跟主線程沒有任何影響,
主線程可以繼續向下執行。
例如:一條有分叉的水管,分叉口就是異步調用入口。
A口爲主線程,B口爲輔助線程,當B口有東西塞住,並不影響A口通水。
異步大概如下圖:
二、定義回調接口
異步代碼執行完後,結果往往需要一些做一些處理,
所以定義一個接口,用來處理異步結果。
/**
* 定義回調接口
* @author YZQ
*
*/
public interface MyCallback {
/**
* 定義處理回調方法
* @param object
*/
void callback(Object object);
}
三、定義異步實現類
/**
* 異步任務類
* @author YZQ
*
*/
public class AsynTask {
/**
* 處理任務
* @param myCallback 處理完任務後的回調
*/
public void task(final MyCallback myCallback){
Thread thread=new Thread(new Runnable() {
@Override
public void run() {
try {
//線程睡眠3秒,模擬該線程執行時間過長,也就是上面說的【B口有東西塞住】
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//完成0到99的累加
int sum=0;
for(int i=0;i<100;i++){
sum+=i;
}
//將結果交給接口的實現類取處理
myCallback.callback(sum);
}
});
//啓動線程
thread.start();
}
}
四、測試類
/**
* 測試類
* @author YZQ
*
*/
public class Test {
public static void main(String[] args) {
//調用異步任務
new AsynTask().task(new MyCallback() {
//實現回調方法
@Override
public void callback(Object object) {
System.out.println("異步回調處理:值 "+object);
}
});
System.out.println("主線程等待異步輸出");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
運行結果:
可以看出:
主線程先輸出了【主線程等待異步輸出】,
隨後輔助線程輸出【異步回調處理:值 4950】。