同步和異步以及阻塞和非阻塞
同步、異步:
概念:消息的通知機制
解釋:涉及到IO通知機制;
所謂同步,就是發起調用後,被調用者處理消息,必須等處理完才直接返回結果,沒處理完之前是不返回的,調用者主動等待結果;
所謂異步,就是發起調用後,被調用者直接返回,但是並沒有返回結果,等處理完消息後,通過狀態、通知或者回調函數來通知調用者,調用者被動接收結果。
阻塞、非阻塞:
概念:程序等待調用結果時的狀態
解釋:涉及到CPU線程調度;
所謂阻塞,就是調用結果返回之前,該執行線程會被掛起,不釋放CPU執行權,線程不能做其它事情,只能等待,只有等到調用結果返回了,才能接著往下執行;
所謂非阻塞,就是在沒有獲取調用結果時,不是一直等待,線程可以往下執行,如果是同步的,通過輪詢的方式檢查有沒有調用結果返回,如果是異步的,會通知回調。
經典故事案例:
人物:老張
道具:普通水壺(水燒開不響);響水壺(水燒開發出響聲)
案例:
1、同步阻塞:
老張在廚房用普通水壺燒水,一直在廚房等著(阻塞),盯到水燒開(同步);
2、異步阻塞:
老張在廚房用響水壺燒水,一直在廚房中等著(阻塞),直到水壺發出響聲(異步),老張知道水燒開了;
3、同步非阻塞:
老張在廚房用普通水壺燒水,在燒水過程中,就到客廳去看電視(非阻塞),然後時不時去廚房看看水燒開了沒--(輪詢檢查同步結果);
老張在廚房用響水壺燒水,在燒水過程中,就到客廳去看電視(非阻塞),當水壺發出響聲(異步),老張就知道--水燒開了。
註意:
1、通常的IO、NIO操作,都是同步的;
2、JDK1.7提供了AIO異步操作的類,如AsynchronousSocketChannel、AsynchronousServerSocketChannel等;
Java也可以通過多線程,在開啟的線程中,通過回調方式,實現異步操作。
同步和異步以及阻塞和非阻塞