1. 程式人生 > 實用技巧 >【原】回撥模式在實際開發中的運用

【原】回撥模式在實際開發中的運用

前言  

     最近工作中接觸並使用到了回撥相關技術點,以及在看執行緒池原始碼過程中和一些第三方元件原始碼的時候也發現了大量的回撥模式運用,所以本篇部落格的核心主題就是圍繞回調相關展開一些探討和思考

 1、什麼是回撥?

  一般來說,模組之間都存在一定的呼叫關係,從呼叫方式上看,可以分為三類同步呼叫、非同步呼叫和回撥。同步呼叫是一種阻塞式呼叫,即在函式A的函式體裡通過書寫函式B的函式名來呼叫之,使記憶體中對應函式B的程式碼得以執行。非同步呼叫是一種類似訊息或事件的機制解決了同步阻塞的問題,例如A通知B後,他們各走各的路,互不影響,不用像同步呼叫那樣,A通知B後,非得等到B走完後,A才繼續走。回撥是一種雙向的呼叫模式,也就是說,被呼叫的介面被呼叫時也會呼叫對方的介面,例如A要呼叫B,B在執行完又要呼叫A。

 2、回撥的用途

  回撥一般用於層間協作,上層將本層函式安裝在下層,這個函式就是回撥,而下層在一定條件下觸發回撥。例如作為一個驅動,是一個底層,他在收到一個數據時,除了完成本層的處理工作外,還將進行回撥,將這個資料交給上層應用層來做進一步處理,這在分層的資料通訊中很普遍。

jdk執行緒池中對回撥的定義

  1. 如下是執行緒池拒絕策略介面,可以看到官方定義了4種拒絕策略,其中可以看到剩下的都是其它第三方包自行實現的
/**
 * A handler for tasks that cannot be executed by a {@link ThreadPoolExecutor}.
 *
 * 
@since 1.5 * @author Doug Lea */ public interface RejectedExecutionHandler { /** * Method that may be invoked by a {@link ThreadPoolExecutor} when * {@link ThreadPoolExecutor#execute execute} cannot accept a * task. This may occur when no more threads or queue slots are * available because their bounds would be exceeded, or upon * shutdown of the Executor. * * <p>In the absence of other alternatives, the method may throw * an unchecked {
@link RejectedExecutionException}, which will be * propagated to the caller of {@code execute}. * * @param r the runnable task requested to be executed * @param executor the executor attempting to execute this task * @throws RejectedExecutionException if there is no remedy */ void rejectedExecution(Runnable r, ThreadPoolExecutor executor); }