wince支持多线程编程吗_以前面试只问多线程,现在都开始问响应式编程了!我懵了...
以前面試只問多線程,現在都開始問響應式編程了!
看完這篇文章你就能有個大體的了解了。
基本介紹
目前比較流行的編程方法論有函數式編程(functional programming)、響應式編程(reactive programming)等。
函數式編程的代表就是工作流模式,而響應式編程的代表就是reactor模式了。
reactor模式廣泛地用于各種RPC框架,例如linux的epoll,redis,netty,kafka等。
事件驅動編程與多線程編程
多線程編程有如下幾個缺點:
- 對于共享資源需要使用鎖結構 容易造成死鎖問題
- 難以Debug
- 多線程破壞了抽象 無法設計出模塊化的程序
- 因為鎖導致回調無法完成
- 想要得到良好的性能很難
- 線程庫不受支持 很多函數不支持線程安全
事件驅動編程有以下幾個特點:
- 一個執行流進程: 沒有CPU的并發
- 在時間上注冊消息(通過回調)
- 事件輪詢等待消息, 調用處理器模型
- 時間處理器沒有搶斷
- 處理器通常是 短生命周期的
兩者相比:
- 事件驅動編發編程盡可能的避免 并發, 而多線程編程則傾向于并發:
- 使用事件驅動更加容易調試
- 在單個CPU上時間驅動程序比線程更加快速
- 事件驅動編程更加面向接口編程
- 多線程提供了真正的并發性
Reactor模式就是一種事件驅動編程的模式,也是IO多路復用的基本設計模式。
他有如下幾個特點
- Reactor模式中會通過分配適當的handler(處理程序)來響應IO事件,類似與AWT 事件處理線程;
- 每個handler執行非阻塞的操作,類似于AWT ActionListeners 事件監聽
- 通過將handler綁定到事件進行管理,類似與AWT addActionListener 添加事件監聽;
基本結構如下
- Handles:句柄,標識OS管理的資源.每個連接由socket句柄表示。
- Synchronous Event Demultiplexer:同步事件多路復用器,在句柄集合上阻塞等待事件的發生。
- Initiation Dispatcher:初始分發器,分發事件處理器的接口。
- Event Handler:事件處理器,指定一個由鉤子方法組成的接口。
- Concrete Event Handler:具體處理事件的方法
整個流程如下:
- 我們注冊Concrete Event Handler到Initiation Dispatcher中。
- Initiation Dispatcher調用每個Event Handler的get_handle接口獲取其綁定的Handle。
- Initiation Dispatcher調用handle_events開始事件處理循環。在這里,Initiation Dispatcher會將步驟2獲取的所有Handle都收集起來,使用Synchronous Event Demultiplexer來等待這些Handle的事件發生。
- 當某個(或某幾個)Handle的事件發生時,Synchronous Event Demultiplexer通知Initiation Dispatcher。
- Initiation Dispatcher根據發生事件的Handle找出所對應的Handler。
- Initiation Dispatcher調用Handler的handle_event方法處理事件。
下面用一個例子來具體說明Reactor模式的運作:
步驟如下:
- 日志服務注冊Logging Acceptor 到初始分發器來處理連接請求;
- 日志服務調用初始分發器的handle_events 方法;
- 初始分發器調用同步事件多路復用器的select 方法,等待連接請求或者日志數據的達到;
- 客戶端連接到日志服務器;
- 初始分發器通知Logging Acceptor 有新連接達到;
- Logging Acceptor 接受新連接;
- Logging Acceptor 創建一個Logging Handler 來為新客戶端服務;
- Logging Handler 將它的socket句柄注冊到初始分發器,并且要求,當socket可讀時,初始分發器通知它;
Reactor線程模型
單線程模型
多線程模型
基于多個反應器的多線程模型
Reactor模式的應用
redis(單線程模型)
Netty(多Reactor線程多Worker線程模型)
Netty的線程模式就是一個實現了Reactor模式的經典模式。
結構對應:
- NioEventLoop ———— Initiation Dispatcher
- Synchronous EventDemultiplexer ———— Selector
- Evnet Handler ———— ChannelHandle
- rConcreteEventHandler ———— 具體的ChannelHandler的實現
模式對應(Netty服務端使用了“多Reactor多線程模式”)
- mainReactor ———— bossGroup(NioEventLoopGroup) 中的某個NioEventLoop
- subReactor ———— workerGroup(NioEventLoopGroup) 中的某個NioEventLoop
- acceptor ———— ServerBootstrapAcceptor
- ThreadPool ———— 用戶自定義線程池
Spring5
2年前 Java 9 發布,其中一個重要的特性就是java.util.concurrent.flow包,它規范了reactive編程中異步非阻塞流處理的背壓(back pressure)問題。java8中的stream可以理解為迭代器模式(Iterator)的實現,而reactive可以理解為觀察者模式(Observer)的實現。Iterator模式是服務線程去拉(pull)數據,而Observer模式是數據主動推(push)給服務線程,如果服務線程消費的太慢或者說數據推送的太快 就會引起阻塞情況 這種現象就叫做背壓,java9推出了reactivestream來規范背壓問題的解決方案。在Java 9之后 Spring5也All in了reactive programming,推出spring reactor包。
References
1.John Ousterhout: Why Threads Are A Bad Idea(for most purposes)
2.Douglas C. Schmidt: Reactor An Object Behavioral Pattern for Demultiplexing and Dispatching Handlers for Synchr
3. Doug Lea: Scalable IO in Java
希望能得到您的 關注、評論、轉發,謝謝!
私信我“資料”,可以免費獲取海量 JAVA技術棧電子書 和 大廠面試題。
總結
以上是生活随笔為你收集整理的wince支持多线程编程吗_以前面试只问多线程,现在都开始问响应式编程了!我懵了...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 北邮 复习 软件工程_软件工程的一些基本
- 下一篇: 计算机网络实验报告哈工大_哈工大计算机网