一種面向多點(diǎn)續(xù)采藍(lán)牙通信的Android線程池設(shè)計(jì)方法
【專利摘要】本發(fā)明公開了一種面向多點(diǎn)續(xù)采藍(lán)牙通信的Android線程池設(shè)計(jì)方法。本方法包含多點(diǎn)續(xù)采藍(lán)牙通信過程、線程池框架設(shè)計(jì)、針對(duì)藍(lán)牙通信的線程異常處理機(jī)制三個(gè)步驟。手持終端通過從機(jī)藍(lán)牙采集多個(gè)傳感節(jié)點(diǎn)數(shù)據(jù)。為確保手持終端與從機(jī)藍(lán)牙之間通信的穩(wěn)定性、提升通信效率、降低線程池風(fēng)險(xiǎn)的可能性?;贏ndroid的線程池由工作線程和輔線程組成。工作線程為連續(xù)藍(lán)牙通信提供空閑的線程空間。輔線程擁有線程異常處理機(jī)制,應(yīng)對(duì)工作線程中任務(wù)運(yùn)行時(shí)可能出現(xiàn)的準(zhǔn)備對(duì)象、數(shù)據(jù)重采異常等情況。
【專利說明】
一種面向多點(diǎn)續(xù)采藍(lán)牙通信的Andro id線程池設(shè)計(jì)方法
技術(shù)領(lǐng)域
[0001]本發(fā)明屬于線程池設(shè)計(jì)領(lǐng)域,具體涉及一種面向多點(diǎn)續(xù)采藍(lán)牙通信的Android線程池設(shè)計(jì)方法。
【背景技術(shù)】
[0002]在Android手持終端(主機(jī)藍(lán)牙)與從機(jī)藍(lán)牙的通信過程中,線程會(huì)被頻繁地建立與關(guān)閉,這將大大增加系統(tǒng)能耗。而線程池是一種多線程的處理方式,處理過程為:將任務(wù)添加到隊(duì)列,然后在創(chuàng)建線程后自動(dòng)啟動(dòng)這些任務(wù)。這樣線程能在多個(gè)請(qǐng)求中復(fù)用,減少系統(tǒng)運(yùn)行時(shí)間,提高系統(tǒng)效率。
[0003]目前主流的線程池包括FixedThreadPoo I (定長線程池)、CachedThreadPoo I (可緩存線程池)、SingleThreadExecutor (單線程化線程池)、ScheduledThreadPool (周期性執(zhí)行線程池)C3FixedThreadPool與CachedThreadPool定義了多個(gè)定長或不定長線程池,其主要面向多線程并發(fā)的情況,對(duì)于同一線程下多任務(wù)亂序執(zhí)行引起的線程死鎖并沒有相應(yīng)的控制機(jī)制。SingleThreadPool是一個(gè)只有單一工作線程的線程池,它可以在線程出現(xiàn)異常時(shí),建立新的工作線程處理任務(wù),保證程序順利的執(zhí)行。但其并沒有引入消息重發(fā)機(jī)制,保證連續(xù)藍(lán)牙通信的穩(wěn)定性和可靠性。ScheduledThreadPoo I是一種定長的線程池,它支持定時(shí)或循環(huán)的任務(wù)執(zhí)行。但是其并沒有引入針對(duì)藍(lán)牙通信的線程異常處理機(jī)制,保證在藍(lán)牙通信出現(xiàn)異常時(shí),線程池始終保持穩(wěn)定,不出現(xiàn)線程池崩潰的情況。
[0004]多點(diǎn)續(xù)采是指手持終端連續(xù)采集多個(gè)傳感節(jié)點(diǎn)的數(shù)據(jù)。由于傳感節(jié)點(diǎn)只能通過從機(jī)藍(lán)牙與手持終端進(jìn)行通信,且不同的傳感節(jié)點(diǎn)適配的從機(jī)藍(lán)牙可能不同,所以為完成一次采集多傳感節(jié)點(diǎn)數(shù)據(jù)的功能,基于Android的手持終端需要依次與多個(gè)從機(jī)藍(lán)牙進(jìn)行通信。首先,在An droid藍(lán)牙通信的過程中,獲取從機(jī)藍(lán)牙的MAC地址,建立與從機(jī)藍(lán)牙之間的socket連接以及發(fā)送與接收藍(lán)牙通信命令都需要在獨(dú)立的線程空間中運(yùn)行,并且各個(gè)任務(wù)之間有明確的先后執(zhí)行順序;其次在進(jìn)行多點(diǎn)續(xù)采的過程中,Android手持終端與從機(jī)藍(lán)牙之間的通信過程需要被連續(xù)執(zhí)行多次;最后藍(lán)牙通信的過程中易受到外界干擾,這可能會(huì)導(dǎo)致線程持續(xù)處于資源等待或信息接收狀態(tài),引起線程死鎖,進(jìn)而導(dǎo)致線程池的崩潰。所以,這就需要設(shè)計(jì)一種面向多點(diǎn)續(xù)采藍(lán)牙通信的Android線程池。
【發(fā)明內(nèi)容】
[0005]本發(fā)明的目的在于針對(duì)已有線程池設(shè)計(jì)存在的缺陷,提供一種面向多點(diǎn)續(xù)采藍(lán)牙通信的Android線程池設(shè)計(jì)方法。
[0006]為了實(shí)現(xiàn)上述目標(biāo),本發(fā)明的構(gòu)思是:針對(duì)多點(diǎn)續(xù)采藍(lán)牙通信的高通信效率需求以及線程池風(fēng)險(xiǎn)系數(shù)高的特性,該線程池設(shè)計(jì)引入相應(yīng)的線程異常處理機(jī)制。
[0007]根據(jù)上述構(gòu)思,本發(fā)明采用的技術(shù)方案為:一種面向多點(diǎn)續(xù)采藍(lán)牙通信的Android線程池設(shè)計(jì)方法,其特征在于操作步驟包含多點(diǎn)續(xù)采藍(lán)牙通信過程、線程池框架設(shè)計(jì)、針對(duì)藍(lán)牙通信的線程異常處理機(jī)制三個(gè)步驟: 步驟a.多點(diǎn)續(xù)采藍(lán)牙通信的實(shí)現(xiàn)方法:
(a-Ι)手持終端進(jìn)行一鍵讀取,開始采集從傳感節(jié)點(diǎn)I到傳感節(jié)點(diǎn)N的數(shù)據(jù);
(a-2)手持終端獲取從機(jī)藍(lán)牙I的MAC地址,并與其建立連接;
(a-3)手持終端向從機(jī)藍(lán)牙I發(fā)送藍(lán)牙寫指令,驅(qū)動(dòng)從機(jī)藍(lán)牙I向傳感節(jié)點(diǎn)I獲取數(shù)據(jù);(a-4)手持終端發(fā)送藍(lán)牙寫指令后,保持藍(lán)牙讀狀態(tài),等待接收從機(jī)藍(lán)牙I返回的從傳感節(jié)點(diǎn)I獲取到的數(shù)據(jù);
(a-5)手持終端接收到數(shù)據(jù)后,對(duì)其進(jìn)行解析,并存儲(chǔ)到手持終端;
(a-6)傳感節(jié)點(diǎn)I數(shù)據(jù)獲取完成后,手持終端開始讀取傳感節(jié)點(diǎn)2的數(shù)據(jù);
(a-7)如果傳感節(jié)點(diǎn)2適配的從機(jī)藍(lán)牙仍為從機(jī)藍(lán)牙I,則保持當(dāng)前連接即可;
(a-8)如果傳感節(jié)點(diǎn)2適配的從機(jī)藍(lán)牙為新的從機(jī)藍(lán)牙,例如從機(jī)藍(lán)牙2。手持終端首先需斷開與當(dāng)前從機(jī)藍(lán)牙的連接,然后獲取從機(jī)藍(lán)牙2的MAC地址,最后與從機(jī)藍(lán)牙2建立連接;
(a-9)手持終端建立與從機(jī)藍(lán)牙的連接后,依照(a-3)到(a-5)的命令采集傳感節(jié)點(diǎn)2的數(shù)據(jù);
(a-10)依次完成(a-7)到(a-9)的步驟,直到傳感節(jié)點(diǎn)N的數(shù)據(jù)被存儲(chǔ)到手持終端為止,結(jié)束本次多點(diǎn)續(xù)采任務(wù);
步驟b.線程池框架設(shè)計(jì)的實(shí)現(xiàn)方法:
(b-Ι)根據(jù)Android手持終端的核心數(shù)以及工作所需的線程數(shù)配置線程池的容量; (b-2)線程池中主要分為工作線程和輔線程;
(b-3)工作線程出現(xiàn)異常時(shí)向輔線程進(jìn)行異常反饋,輔線程根據(jù)反饋的內(nèi)容,提出相應(yīng)的異常處理方案;
(b-4)讀取傳感節(jié)點(diǎn)數(shù)據(jù)所需的任務(wù)主要分為讀MAC地址、建立socket連接、藍(lán)牙寫指令、藍(lán)牙讀指令;
(b-5)按照任務(wù)執(zhí)行的先后順序進(jìn)行排序,依次占用工作線程;
(b-6)工作線程在限定時(shí)間內(nèi)無任務(wù)占用,表明多點(diǎn)續(xù)采藍(lán)牙通信結(jié)束,輔線程命令工作線程自動(dòng)關(guān)閉,等到有新的任務(wù)提出線程空間請(qǐng)求時(shí)在重新創(chuàng)建;
步驟c.針對(duì)藍(lán)牙通信的線程異常處理機(jī)制:
c-Ι.準(zhǔn)備任務(wù)所需對(duì)象異常處理機(jī)制的實(shí)現(xiàn)方法:
(c-1-l)工作線程中的新任務(wù)開始運(yùn)行前,輔線程獲取當(dāng)前任務(wù)所需對(duì)象的狀態(tài);(c-1-2)如果該任務(wù)所需對(duì)象沒有準(zhǔn)備齊全,輔線程會(huì)命令工作線程中的任務(wù),在限定時(shí)間內(nèi)等待任務(wù)所需對(duì)象空閑;
(c_l_3)如果在限定時(shí)間內(nèi),任務(wù)所需對(duì)象準(zhǔn)備齊全,則開始任務(wù);
(c-1-4)如果在限定時(shí)間內(nèi),任務(wù)所需對(duì)象沒有準(zhǔn)備齊全,則判定線程池死鎖,拋棄該線程請(qǐng)求,讀取下一個(gè)傳感節(jié)點(diǎn)數(shù)據(jù);c-2數(shù)據(jù)重采機(jī)制的實(shí)現(xiàn)方法:
(c-2-l)當(dāng)手持終端第一次發(fā)送讀命令,超過限定時(shí)間,仍沒有獲取到傳感節(jié)點(diǎn)的反饋數(shù)據(jù),則重新運(yùn)行對(duì)該從機(jī)藍(lán)牙的寫命令;
(c-2-2)從機(jī)藍(lán)牙收到請(qǐng)求再次向傳感節(jié)點(diǎn)發(fā)送讀命令;
(c-2-3)手持終端保持藍(lán)牙讀狀態(tài),等待接收從機(jī)藍(lán)牙反饋的數(shù)據(jù); (c-2-4)若限定時(shí)間內(nèi)仍沒有收到數(shù)據(jù),判定該傳感節(jié)點(diǎn)故障,建議進(jìn)行點(diǎn)對(duì)點(diǎn)通信; (c-2-5)若在限定時(shí)間內(nèi)完成數(shù)據(jù)的接收,則進(jìn)行數(shù)據(jù)的解析,并存儲(chǔ)到手持終端; c-3其他異常情況處理方法:
(c-3-l)除藍(lán)牙讀指令之外的任務(wù)占用工作線程超過限定時(shí)間后仍未完成,判定該任務(wù)執(zhí)行異常,拋棄本次任務(wù)請(qǐng)求;
(c-3-2)工作線程在任務(wù)執(zhí)行時(shí)或任務(wù)執(zhí)行后出現(xiàn)異常,該工作線程會(huì)被自動(dòng)拋棄,線程池會(huì)為待處理任務(wù)自動(dòng)開辟新的工作線程;
(c-3-3)工作線程中的每個(gè)任務(wù)執(zhí)行完成后,輔線程會(huì)核準(zhǔn)線程池的線程數(shù)是否與開始的設(shè)置相同,當(dāng)發(fā)生線程泄露或線程運(yùn)行異常情況時(shí),輔線程會(huì)在線程池中添加新的工作線程作為補(bǔ)充;
(c-3-4)工作線程長時(shí)間無任務(wù)占用時(shí),輔線程關(guān)閉該工作線程,等待有新任務(wù)需求時(shí)再重新創(chuàng)建。
[0008]本發(fā)明與現(xiàn)有技術(shù)相比較,具有如下顯而易見的突出實(shí)質(zhì)性特點(diǎn)和顯著技術(shù)進(jìn)步:
1、在手持終端連續(xù)采集多傳感節(jié)點(diǎn)的背景下,盡可能的保證傳輸?shù)目煽啃砸约巴ㄐ判剩档土顺霈F(xiàn)線程風(fēng)險(xiǎn)的可能性;
2、引入了面向連續(xù)藍(lán)牙通信的線程異常處理機(jī)制,保證了線程池的魯棒性以及連續(xù)藍(lán)牙通信的效率;
3、其具有線程池風(fēng)險(xiǎn)低,通信效率高等優(yōu)點(diǎn),是一種可靠的面向多點(diǎn)續(xù)采藍(lán)牙通信的Android線程池設(shè)計(jì)。
【附圖說明】
[0009]圖1為多點(diǎn)續(xù)采藍(lán)牙通信的結(jié)構(gòu)圖;
圖2為線程池框架圖;
圖3為工作線程任務(wù)流程圖;
圖4為準(zhǔn)備任務(wù)所需對(duì)象異常處理流程圖;
圖5為數(shù)據(jù)重采機(jī)制流程圖。
【具體實(shí)施方式】
[0010]本發(fā)明的優(yōu)選實(shí)施例結(jié)合附圖詳述如下:
實(shí)施例一:
參見圖1?圖5,本面向面向多點(diǎn)續(xù)采藍(lán)牙通信的Android線程池設(shè)計(jì)方法,其特征在于操作步驟包含:a.多點(diǎn)續(xù)采藍(lán)牙通信過程、b.線程池框架設(shè)計(jì)和c.針對(duì)藍(lán)牙通信的線程異常處理機(jī)制三個(gè)步驟。
[0011]實(shí)施例二:
本實(shí)施例與實(shí)施例一基本相同,特別之處如下:
所述步驟a.多點(diǎn)續(xù)采藍(lán)牙通信的實(shí)現(xiàn)方法:
(a-1)手持終端進(jìn)行一鍵讀取,開始采集從傳感節(jié)點(diǎn)I到傳感節(jié)點(diǎn)N的數(shù)據(jù);
(a-2)手持終端獲取從機(jī)藍(lán)牙I的MAC地址,并與其建立連接; (a-3)手持終端向從機(jī)藍(lán)牙I發(fā)送藍(lán)牙寫指令,驅(qū)動(dòng)從機(jī)藍(lán)牙I向傳感節(jié)點(diǎn)I獲取數(shù)據(jù);(a-4)手持終端發(fā)送藍(lán)牙寫指令后,保持藍(lán)牙讀狀態(tài),等待接收從機(jī)藍(lán)牙I返回的從傳感節(jié)點(diǎn)I獲取到的數(shù)據(jù);
(a-5)手持終端接收到數(shù)據(jù)后,對(duì)其進(jìn)行解析,并存儲(chǔ)到手持終端;
(a-6)傳感節(jié)點(diǎn)I數(shù)據(jù)獲取完成后,手持終端開始讀取傳感節(jié)點(diǎn)2的數(shù)據(jù);
(a-7)如果傳感節(jié)點(diǎn)2適配的從機(jī)藍(lán)牙仍為從機(jī)藍(lán)牙I,則保持當(dāng)前連接即可;
(a-8)如果傳感節(jié)點(diǎn)2適配的從機(jī)藍(lán)牙為新的從機(jī)藍(lán)牙,例如從機(jī)藍(lán)牙2。手持終端首先需斷開與當(dāng)前從機(jī)藍(lán)牙的連接,然后獲取從機(jī)藍(lán)牙2的MAC地址,最后與從機(jī)藍(lán)牙2建立連接;
(a-9)手持終端建立與從機(jī)藍(lán)牙的連接后,依照(a-3)到(a-5)的命令采集傳感節(jié)點(diǎn)2的數(shù)據(jù);
(a-10)依次完成(a-7)到(a-9)的步驟,直到傳感節(jié)點(diǎn)N的數(shù)據(jù)被存儲(chǔ)到手持終端為止,結(jié)束本次多點(diǎn)續(xù)采任務(wù);
所述步驟b.線程池框架設(shè)計(jì)的實(shí)現(xiàn)方法:
(b-Ι)根據(jù)Android手持終端的核心數(shù)以及工作所需的線程數(shù)配置線程池的容量; (b-2)線程池中主要分為工作線程和輔線程;
(b-3)工作線程出現(xiàn)異常時(shí)向輔線程進(jìn)行異常反饋,輔線程根據(jù)反饋的內(nèi)容,提出相應(yīng)的異常處理方案;
(b-4)讀取傳感節(jié)點(diǎn)數(shù)據(jù)所需的任務(wù)主要分為讀MAC地址、建立socket連接、藍(lán)牙寫指令、藍(lán)牙讀指令;
(b-5)按照任務(wù)執(zhí)行的先后順序進(jìn)行排序,依次占用工作線程;
(b-6)工作線程在限定時(shí)間內(nèi)無任務(wù)占用,表明多點(diǎn)續(xù)采藍(lán)牙通信結(jié)束,輔線程命令工作線程自動(dòng)關(guān)閉,等到有新的任務(wù)提出線程空間請(qǐng)求時(shí)在重新創(chuàng)建;
所述步驟c.針對(duì)藍(lán)牙通信的線程異常處理機(jī)制: c-Ι.準(zhǔn)備任務(wù)所需對(duì)象異常處理機(jī)制的實(shí)現(xiàn)方法:
(c-1-l)工作線程中的新任務(wù)開始運(yùn)行前,輔線程獲取當(dāng)前任務(wù)所需對(duì)象的狀態(tài);(c-1-2)如果該任務(wù)所需對(duì)象沒有準(zhǔn)備齊全,輔線程會(huì)命令工作線程中的任務(wù),在限定時(shí)間內(nèi)等待任務(wù)所需對(duì)象空閑;
(c_l_3)如果在限定時(shí)間內(nèi),任務(wù)所需對(duì)象準(zhǔn)備齊全,則開始任務(wù);
(c-1-4)如果在限定時(shí)間內(nèi),任務(wù)所需對(duì)象沒有準(zhǔn)備齊全,則判定線程池死鎖,拋棄該線程請(qǐng)求,讀取下一個(gè)傳感節(jié)點(diǎn)數(shù)據(jù);c-2數(shù)據(jù)重采機(jī)制的實(shí)現(xiàn)方法:
(c-2-l)當(dāng)手持終端第一次發(fā)送讀命令,超過限定時(shí)間,仍沒有獲取到傳感節(jié)點(diǎn)的反饋數(shù)據(jù),則重新運(yùn)行對(duì)該從機(jī)藍(lán)牙的寫命令;
(c-2-2)從機(jī)藍(lán)牙收到請(qǐng)求再次向傳感節(jié)點(diǎn)發(fā)送讀命令;
(c-2-3)手持終端保持藍(lán)牙讀狀態(tài),等待接收從機(jī)藍(lán)牙反饋的數(shù)據(jù);
(c-2-4)若限定時(shí)間內(nèi)仍沒有收到數(shù)據(jù),判定該傳感節(jié)點(diǎn)故障,建議進(jìn)行點(diǎn)對(duì)點(diǎn)通信; (c-2-5)若在限定時(shí)間內(nèi)完成數(shù)據(jù)的接收,則進(jìn)行數(shù)據(jù)的解析,并存儲(chǔ)到手持終端; c-3其他異常情況處理方法: (c-3-l)除藍(lán)牙讀指令之外的任務(wù)占用工作線程超過限定時(shí)間后仍未完成,判定該任務(wù)執(zhí)行異常,拋棄本次任務(wù)請(qǐng)求;
(c-3-2)工作線程在任務(wù)執(zhí)行時(shí)或任務(wù)執(zhí)行后出現(xiàn)異常,該工作線程會(huì)被自動(dòng)拋棄,線程池會(huì)為待處理任務(wù)自動(dòng)開辟新的工作線程;
(c-3-3)工作線程中的每個(gè)任務(wù)執(zhí)行完成后,輔線程會(huì)核準(zhǔn)線程池的線程數(shù)是否與開始的設(shè)置相同,當(dāng)發(fā)生線程泄露或線程運(yùn)行異常情況時(shí),輔線程會(huì)在線程池中添加新的工作線程作為補(bǔ)充;
(c-3-4)工作線程長時(shí)間無任務(wù)占用時(shí),輔線程關(guān)閉該工作線程,等待有新任務(wù)需求時(shí)再重新創(chuàng)建。
[0012]實(shí)施例三:
本面向多點(diǎn)續(xù)采藍(lán)牙通信的Android線程池設(shè)計(jì)主要包含多點(diǎn)續(xù)采藍(lán)牙通信過程、線程池框架設(shè)計(jì)、針對(duì)藍(lán)牙通信的線程異常處理機(jī)制三個(gè)部分。
[0013]多點(diǎn)續(xù)采藍(lán)牙通信的結(jié)構(gòu)圖如圖1所示。多點(diǎn)續(xù)采藍(lán)牙通信面向的是手持終端與多個(gè)傳感節(jié)點(diǎn)通信的情況。由于傳感節(jié)點(diǎn)只能通過從機(jī)藍(lán)牙完成與手持終端通信,且不同的傳感節(jié)點(diǎn)適配的從機(jī)藍(lán)牙可能不同,所以為完成一次讀取多傳感節(jié)點(diǎn)信息的功能,基于Android的手持終端需要依次與多個(gè)從機(jī)藍(lán)牙進(jìn)行通信。一鍵讀取按鈕點(diǎn)擊后,手持終端要獲取傳感節(jié)點(diǎn)I的數(shù)據(jù)。首先需要與從機(jī)藍(lán)牙I建立連接。連接完成后,手持終端向從機(jī)藍(lán)牙發(fā)送寫指令。藍(lán)牙從機(jī)接收到該指令后向手持終端反饋接收完成,并向傳感節(jié)點(diǎn)獲取數(shù)據(jù)。獲取完成后,藍(lán)牙從機(jī)再將數(shù)據(jù)封裝并回傳到手持終端。手持終端通過藍(lán)牙讀指令接收數(shù)據(jù)并解析。
[0014]傳感節(jié)點(diǎn)I數(shù)據(jù)讀取完成后,讀取傳感節(jié)點(diǎn)2的數(shù)據(jù)。由于傳感節(jié)點(diǎn)2適配的從機(jī)藍(lán)牙仍然為從機(jī)藍(lán)牙1,故不用獲取新的藍(lán)牙MAC地址,重新建立藍(lán)牙連接。只需要發(fā)送新的寫指令給從機(jī)藍(lán)牙,從機(jī)藍(lán)牙就能和傳感節(jié)點(diǎn)2進(jìn)行通信并獲取數(shù)據(jù)回傳到手持終端。
[0015]當(dāng)手持終端讀取傳感節(jié)點(diǎn)3的信息時(shí),由于其連接的從機(jī)藍(lán)牙為從機(jī)藍(lán)牙2,與之前連接的藍(lán)牙節(jié)點(diǎn)不同,所以手持終端需要斷開當(dāng)前的藍(lán)牙連接,獲取從機(jī)藍(lán)牙2的MAC地址并建立新的藍(lán)牙連接,再重復(fù)上述操作。依次讀取傳感節(jié)點(diǎn)的數(shù)據(jù),直到傳感節(jié)點(diǎn)N的數(shù)據(jù)獲取完成,本次多點(diǎn)續(xù)采藍(lán)牙通信結(jié)束。
[0016]線程池框架如圖2所示。線程池主要由工作線程和輔線程組成,工作線程為任務(wù)的執(zhí)行提供空閑的線程空間,輔線程監(jiān)控當(dāng)前執(zhí)行任務(wù)和工作線程的狀態(tài)。
[00? 7 ]讀取傳感節(jié)點(diǎn)的過程主要分為讀MAC地址、建立socket連接、藍(lán)牙寫指令、藍(lán)牙讀指令。在多點(diǎn)續(xù)采藍(lán)牙通信的過程中,每個(gè)傳感節(jié)點(diǎn)數(shù)據(jù)讀取所需的任務(wù)任務(wù)依次通過工作線程,直到所有的傳感節(jié)點(diǎn)數(shù)據(jù)全部讀取完成。當(dāng)工作線程中產(chǎn)生異常時(shí),輔線程會(huì)向工作線程提出異常處理請(qǐng)求。工作線程將拋棄當(dāng)前任務(wù),插入異常處理所需的任務(wù),對(duì)任務(wù)執(zhí)行流程重新進(jìn)行排序。當(dāng)工作線程長時(shí)間沒有被占用時(shí),該線程就會(huì)被拋棄。等到有新的任務(wù)提出線程需求時(shí),再次創(chuàng)建新的工作線程。
[0018]工作線程任務(wù)流程圖如圖3所示,手持終端首先獲取待讀取傳感節(jié)點(diǎn)所適配的從機(jī)藍(lán)牙,其次判斷該從機(jī)藍(lán)牙是否與正連接著的從機(jī)藍(lán)牙相同。如果不同,斷開當(dāng)前連接的從機(jī)藍(lán)牙,與新的從機(jī)藍(lán)牙建立連接。如果待連接的從機(jī)藍(lán)牙與正連接著的從機(jī)藍(lán)牙,則保持該連接狀態(tài)。通信連接建立后,發(fā)送藍(lán)牙寫指令,驅(qū)動(dòng)從機(jī)藍(lán)牙設(shè)備向傳感節(jié)點(diǎn)獲取信息。藍(lán)牙寫指令發(fā)送完成后,手持終端開啟監(jiān)聽,等待接收從機(jī)藍(lán)牙發(fā)回的數(shù)據(jù)。如果超過限定的時(shí)間數(shù)據(jù)還沒接收完成,則運(yùn)行線程異常處理機(jī)制。如果在限定時(shí)間內(nèi)接收到完整信息,則對(duì)其進(jìn)行解析,并將內(nèi)容保存到手持終端中。之后開始準(zhǔn)備下一個(gè)傳感節(jié)點(diǎn)信息的獲取。
[0019]線程異常處理機(jī)制在輔線程收到工作線程異常時(shí)啟動(dòng)。
[0020]準(zhǔn)備任務(wù)所需對(duì)象異常處理如圖4所示。工作線程中的新任務(wù)開始運(yùn)行前,輔線程首先會(huì)獲取當(dāng)前任務(wù)所需對(duì)象的狀態(tài)。如果該任務(wù)所需對(duì)象沒有準(zhǔn)備齊全,輔線程會(huì)命令工作線程中任務(wù)在限定時(shí)間內(nèi)等待任務(wù)所需對(duì)象空閑。如果超過限定時(shí)間,該任務(wù)所需的對(duì)象仍沒有準(zhǔn)備齊全,則判定該線程池死鎖,拋棄該線程請(qǐng)求,讀取下一個(gè)傳感節(jié)點(diǎn)數(shù)據(jù)。如果任務(wù)所需對(duì)象在任務(wù)開始前已準(zhǔn)備完成,則開始進(jìn)行任務(wù)。
[0021]數(shù)據(jù)重采機(jī)制流程圖如圖5所示。藍(lán)牙讀指令發(fā)送后,由于傳感節(jié)點(diǎn)會(huì)定時(shí)休眠,所以從機(jī)藍(lán)牙接收到讀命令向傳感節(jié)點(diǎn)讀取信息時(shí),傳感節(jié)點(diǎn)可能正在休眠,無法反饋數(shù)據(jù)。當(dāng)手持終端發(fā)送一次讀命令,超過限定時(shí)間仍然沒有反饋時(shí),重新運(yùn)行對(duì)該從機(jī)藍(lán)牙的寫命令。從機(jī)藍(lán)牙收到請(qǐng)求再次向傳感節(jié)點(diǎn)發(fā)送讀命令,手持終端開啟藍(lán)牙讀指令再次讀取從機(jī)藍(lán)牙回復(fù)的數(shù)據(jù)。若仍沒有接收到,判定該傳感節(jié)點(diǎn)故障,建議進(jìn)行點(diǎn)對(duì)點(diǎn)通信。如果在限定時(shí)間內(nèi)完成數(shù)據(jù)的接收,則進(jìn)行數(shù)據(jù)的解析,并存儲(chǔ)到手持終端。
[0022]若其他任務(wù)占用工作線程超過限定時(shí)間后仍未完成,判定該判定該線程執(zhí)行異常,拋棄該線程請(qǐng)求,讀取下一個(gè)傳感節(jié)點(diǎn)數(shù)據(jù)。
[0023]工作線程中的每個(gè)任務(wù)執(zhí)行完成后,輔線程會(huì)核準(zhǔn)線程池的線程數(shù)是否與開始的設(shè)置相同,當(dāng)發(fā)生線程泄露或線程運(yùn)行異常情況時(shí),輔線程會(huì)在線程池中添加新的工作線程作為補(bǔ)充。
[0024]若工作線程長時(shí)間無任務(wù)占用時(shí),輔線程會(huì)關(guān)閉該工作線程,等待有新任務(wù)需求時(shí)再重新創(chuàng)建。
【主權(quán)項(xiàng)】
1.一種面向多點(diǎn)續(xù)采藍(lán)牙通信的Android線程池設(shè)計(jì)方法,其特征在于操作步驟包含:a.多點(diǎn)續(xù)采藍(lán)牙通信過程、b.線程池框架設(shè)計(jì)和c.針對(duì)藍(lán)牙通信的線程異常處理機(jī)制三個(gè)步驟。2.根據(jù)權(quán)利要求1所述的面向多點(diǎn)續(xù)采藍(lán)牙通信的Android線程池設(shè)計(jì)方法,其特征在于所述步驟a.多點(diǎn)續(xù)采藍(lán)牙通信的實(shí)現(xiàn)方法: (a-Ι)手持終端進(jìn)行一鍵讀取,開始采集從傳感節(jié)點(diǎn)I到傳感節(jié)點(diǎn)N的數(shù)據(jù); (a-2 )手持終端獲取從機(jī)藍(lán)牙I的MAC地址,并與其建立連接; (a-3)手持終端向從機(jī)藍(lán)牙I發(fā)送藍(lán)牙寫指令,驅(qū)動(dòng)從機(jī)藍(lán)牙I向傳感節(jié)點(diǎn)I獲取數(shù)據(jù);(a-4)手持終端發(fā)送藍(lán)牙寫指令后,保持藍(lán)牙讀狀態(tài),等待接收從機(jī)藍(lán)牙I返回的從傳感節(jié)點(diǎn)I獲取到的數(shù)據(jù); (a-5 )手持終端接收到數(shù)據(jù)后,對(duì)其進(jìn)行解析,并存儲(chǔ)到手持終端; (a-6)傳感節(jié)點(diǎn)I數(shù)據(jù)獲取完成后,手持終端開始讀取傳感節(jié)點(diǎn)2的數(shù)據(jù); (a-7)如果傳感節(jié)點(diǎn)2適配的從機(jī)藍(lán)牙仍為從機(jī)藍(lán)牙I,則保持當(dāng)前連接即可; (a-8)如果傳感節(jié)點(diǎn)2適配的從機(jī)藍(lán)牙為新的從機(jī)藍(lán)牙,例如從機(jī)藍(lán)牙2; 手持終端首先需斷開與當(dāng)前從機(jī)藍(lán)牙的連接,然后獲取從機(jī)藍(lán)牙2的MAC地址,最后與從機(jī)藍(lán)牙2建立連接; (a-9)手持終端建立與從機(jī)藍(lán)牙的連接后,依照(a-3)到(a-5)的命令采集傳感節(jié)點(diǎn)2的數(shù)據(jù); (a-10)依次完成(a-7)到(a-9)的步驟,直到傳感節(jié)點(diǎn)N的數(shù)據(jù)被存儲(chǔ)到手持終端為止,結(jié)束本次多點(diǎn)續(xù)采任務(wù)。3.根據(jù)權(quán)利要求1所述的面向多點(diǎn)續(xù)采藍(lán)牙通信的Android線程池設(shè)計(jì)方法,其特征在于所述步驟b.線程池框架設(shè)計(jì)的實(shí)現(xiàn)方法: (b-Ι)根據(jù)Android手持終端的核心數(shù)以及工作所需的線程數(shù)配置線程池的容量; (b-2)線程池中主要分為工作線程和輔線程; (b-3)工作線程出現(xiàn)異常時(shí)向輔線程進(jìn)行異常反饋,輔線程根據(jù)反饋的內(nèi)容,提出相應(yīng)的異常處理方案; (b-4)讀取傳感節(jié)點(diǎn)數(shù)據(jù)所需的任務(wù)主要分為讀MAC地址、建立socket連接、藍(lán)牙寫指令、藍(lán)牙讀指令; (b-5)按照任務(wù)執(zhí)行的先后順序進(jìn)行排序,依次占用工作線程; (b-6)工作線程在限定時(shí)間內(nèi)無任務(wù)占用,表明多點(diǎn)續(xù)采藍(lán)牙通信結(jié)束,輔線程命令工作線程自動(dòng)關(guān)閉,等到有新的任務(wù)提出線程空間請(qǐng)求時(shí)在重新創(chuàng)建。4.根據(jù)權(quán)利要求1所述的面向多點(diǎn)續(xù)采藍(lán)牙通信的Android線程池設(shè)計(jì)方法,其特征在于所述步驟c.針對(duì)藍(lán)牙通信的線程異常處理機(jī)制: c-Ι.準(zhǔn)備任務(wù)所需對(duì)象異常處理機(jī)制的實(shí)現(xiàn)方法: (c-1-l)工作線程中的新任務(wù)開始運(yùn)行前,輔線程獲取當(dāng)前任務(wù)所需對(duì)象的狀態(tài);(c-1-2)如果該任務(wù)所需對(duì)象沒有準(zhǔn)備齊全,輔線程會(huì)命令工作線程中的任務(wù),在限定時(shí)間內(nèi)等待任務(wù)所需對(duì)象空閑; (c_l_3)如果在限定時(shí)間內(nèi),任務(wù)所需對(duì)象準(zhǔn)備齊全,則開始任務(wù); (c-1-4)如果在限定時(shí)間內(nèi),任務(wù)所需對(duì)象沒有準(zhǔn)備齊全,則判定線程池死鎖,拋棄該線程請(qǐng)求,讀取下一個(gè)傳感節(jié)點(diǎn)數(shù)據(jù);c-2數(shù)據(jù)重采機(jī)制的實(shí)現(xiàn)方法: (c-2-l)當(dāng)手持終端第一次發(fā)送讀命令,超過限定時(shí)間,仍沒有獲取到傳感節(jié)點(diǎn)的反饋數(shù)據(jù),則重新運(yùn)行對(duì)該從機(jī)藍(lán)牙的寫命令; (c-2-2 )從機(jī)藍(lán)牙收到請(qǐng)求再次向傳感節(jié)點(diǎn)發(fā)送讀命令; (c-2-3)手持終端保持藍(lán)牙讀狀態(tài),等待接收從機(jī)藍(lán)牙反饋的數(shù)據(jù); (c-2-4)若限定時(shí)間內(nèi)仍沒有收到數(shù)據(jù),判定該傳感節(jié)點(diǎn)故障,建議進(jìn)行點(diǎn)對(duì)點(diǎn)通信; (c-2-5)若在限定時(shí)間內(nèi)完成數(shù)據(jù)的接收,則進(jìn)行數(shù)據(jù)的解析,并存儲(chǔ)到手持終端; c-3其他異常情況處理方法: (c-3-l)除藍(lán)牙讀指令之外的任務(wù)占用工作線程超過限定時(shí)間后仍未完成,判定該任務(wù)執(zhí)行異常,拋棄本次任務(wù)請(qǐng)求; (c-3-2)工作線程在任務(wù)執(zhí)行時(shí)或任務(wù)執(zhí)行后出現(xiàn)異常,該工作線程會(huì)被自動(dòng)拋棄,線程池會(huì)為待處理任務(wù)自動(dòng)開辟新的工作線程; (c-3-3)工作線程中的每個(gè)任務(wù)執(zhí)行完成后,輔線程會(huì)核準(zhǔn)線程池的線程數(shù)是否與開始的設(shè)置相同,當(dāng)發(fā)生線程泄露或線程運(yùn)行異常情況時(shí),輔線程會(huì)在線程池中添加新的工作線程作為補(bǔ)充; (c-3-4)工作線程長時(shí)間無任務(wù)占用時(shí),輔線程關(guān)閉該工作線程,等待有新任務(wù)需求時(shí)再重新創(chuàng)建。
【文檔編號(hào)】H04W76/02GK105868013SQ201610199567
【公開日】2016年8月17日
【申請(qǐng)日】2016年4月4日
【發(fā)明人】嚴(yán)軍, 謝宇晟
【申請(qǐng)人】上海大學(xué)