天天看點

2.android中使用鎖來相容netty用戶端的寫法

文章目錄

  • ​​部落格概述​​
  • ​​具體方案​​
  • ​​問題背景​​
  • ​​解決方案​​
  • ​​解決并發問題​​
  • ​​解決netty用戶端接受消息的線程協作問題。​​
  • ​​總結​​

部落格概述

在android項目開發中往往遇到多線程之間協作的場景,控制啟動,控制暫停,傳遞參數等都是非常常見的。例如在一個activity中使用handler在主線程和子線程之間通訊。本部落格要講的是一個實戰操作。場景如下,android機在與外部藍牙裝置連接配接成功後,會發起socket連接配接,socket連接配接是用netty實作的。因為netty用戶端的慣有寫法會導緻在子線程中執行的socket連接配接不能直接獲得響應,該響應決定了接下來在子線程中一些業務邏輯的執行。對于這種場景,我考慮了一種基于鎖的解決方案。

具體方案

問題背景

該方法,姑且稱之為LoginBiz(),觸發該方法的service有2個,極端情況下可能發生并發。這是一個需要解決的問題A,然後如何靈活的獲得netty監聽器獲得到的來自遠端的資料,繼續執行LoginBiz的後續方法是問題B。LoginBiz因為設計的關系不屬于任何的android元件。

解決方案

解決并發問題

首先将Biz方法所在的類進行單例,單例手段不限制。然後在loginBiz方法裡面,使用細粒度的重入鎖,該重入鎖的具體對象在類被建立時初始化。使用try-finally的最佳實踐,在try方法塊裡面上鎖,後面是具體的業務流程,finally裡面解鎖。這樣就通過單例+重入鎖的形式,保證了多終端情況下的并發問題。相當于強制串行化,但是android工控機根本不需要處理這種并發。

解決netty用戶端接受消息的線程協作問題。

總結

繼續閱讀