Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
armonyOS 2提供了兩種應(yīng)用開發(fā)語言:Java和JS。Java線程特性能夠讓多任務(wù)并行,充分利用硬件資源開發(fā)出高性能的應(yīng)用。而JS卻是一個(gè)單線程語言,無法像Java一樣創(chuàng)建新的Thread,用JS語言開發(fā)是否會(huì)導(dǎo)致硬件資源無法充分利用的情況呢?
本文給大家介紹“ACE JS的單線程異步機(jī)制”就是解決這個(gè)問題的。然而,說到 “單線程”與“異步”,大家可能會(huì)比較疑惑,因?yàn)閱尉€程和異步在概念上是沖突的,單線程無法做到多任務(wù)并發(fā),也就不會(huì)存在異步這種通信機(jī)制。
確實(shí),JS語言本身是無法實(shí)現(xiàn)異步的,但是ACE JS框架卻提供了多線程的宿主環(huán)境,通過消息通信機(jī)制讓JS語言有了異步的屬性,下面我們來詳細(xì)描述其原理。
使用JS開發(fā)HarmonyOS應(yīng)用,使用的開發(fā)框架名為ACE(Ability Cross-Platform Environment),該框架適用于手機(jī)、平板、智慧屏、智慧表、車機(jī)等設(shè)備,具備“一次開發(fā),多端部署”的能力。
ACE框架包括應(yīng)用層(Application)、前端框架層(Framework)、引擎層(Engine)和平臺(tái)適配層(Porting Layer),如下圖所示:
?● Application
應(yīng)用層表示開發(fā)者使用JS UI框架開發(fā)的FA應(yīng)用,這里的FA應(yīng)用特指JS FA應(yīng)用。
● Framework
前端框架層主要完成前端頁面解析,以及提供MVVM(Model-View-ViewModel)開發(fā)模式、頁面路由機(jī)制和自定義組件等能力。
● Engine
引擎層主要提供動(dòng)畫解析、DOM(Document Object Model)樹構(gòu)建、布局計(jì)算、渲染命令構(gòu)建與繪制、事件管理等能力。
● Porting Layer
適配層主要完成對(duì)平臺(tái)層進(jìn)行抽象,提供抽象接口,可以對(duì)接到系統(tǒng)平臺(tái)。比如:事件對(duì)接、渲染管線對(duì)接和系統(tǒng)生命周期對(duì)接等。
?
?
每個(gè)HarmonyOS JS應(yīng)用,都是通過上圖所示的ACE開發(fā)框架進(jìn)行加載渲染的。ACE開發(fā)框架包含了JS線程、UI線程、GPU線程、IO線程,并且在ACE框架外還會(huì)存在一類后臺(tái)任務(wù)線程。
其中GPU線程與IO線程主要是ACE框架初始化與頁面加載渲染的過程需要的,為ACE框架內(nèi)部的專有線程,不會(huì)被應(yīng)用直接操作到,應(yīng)用不需要特別關(guān)注;UI線程、JS線程和后臺(tái)任務(wù)線程會(huì)與應(yīng)用開發(fā)代碼相關(guān),后面著重分析這三個(gè)線程的作用和關(guān)系。
● UI線程:負(fù)責(zé)應(yīng)用界面的繪制刷新,與應(yīng)用的進(jìn)程號(hào)相同,又叫主線程。如果開發(fā)JS+JAVA的混合編程,JAVA PA(Particle Ability)的onStart/onConnect等Ability生命周期回調(diào)便是運(yùn)行在主線程,若在這些生命周期回調(diào)上執(zhí)行耗時(shí)操作則會(huì)導(dǎo)致JS UI的繪制刷新卡住。
● JS線程:應(yīng)用的JS代碼會(huì)被JS引擎解析執(zhí)行,并運(yùn)行在JS線程上,而JS又是單線程語言,所以目前我們工程中看到的所有的JS代碼都會(huì)執(zhí)行在這個(gè)進(jìn)程下唯一的JS線程上。
● 后臺(tái)任務(wù)線程:這里是對(duì)ACE框架外部的后臺(tái)線程的一個(gè)統(tǒng)稱,并不單指一個(gè)線程,也并不唯一。后臺(tái)任務(wù)線程包含了Java PA線程、文件操作API、網(wǎng)絡(luò)訪問API內(nèi)部實(shí)現(xiàn)等相關(guān)線程。
下面我們結(jié)合測試代碼來看一下這3個(gè)線程之間的關(guān)系。
為了驗(yàn)證JS線程與UI線程的關(guān)系,我們準(zhǔn)備了一個(gè)實(shí)驗(yàn)性質(zhì)的Demo,主要代碼以及運(yùn)行過程的Log如下:
首先我們?cè)贗DE建立一個(gè)Empty Ablity(JS)模板的HelloWorld工程,在生命周期、按鈕響應(yīng)回調(diào)方法里增加Log以觀察線程情況。剛創(chuàng)建的app.js中Application生命周期默認(rèn)已經(jīng)有Log,無需額外添加。
我們只需要在主界面index.js文件中onInit增加日志:
console.info(<span class="hljs-string">'page.default onInit'</span>);復(fù)制
然后在index.hml中增加一個(gè)button以及會(huì)一直進(jìn)行動(dòng)畫的progress組件:
<button id='button1' onclick="onButtonClick">I'm a button</button>
<progress type="circular"/>復(fù)制
最后在index.js中增加按鈕點(diǎn)擊響應(yīng)事件以及Log,并且嘗試sleep阻塞js線程:
function sleep(delay) {
for (var t = Date.now(); Date.now() - t <= delay; );
}
onButtonClick() {
console.info('onButtonClick begin');
sleep(1000);
console.info('onButtonClick end');
}復(fù)制
將應(yīng)用運(yùn)行起來,點(diǎn)擊兩次按鈕,得到如下Log:
?
?
從輸出的Log中,我們可以看到這個(gè)JS FA進(jìn)程號(hào)為22592,也就是說UI線程是22592;生命周期回調(diào)以及按鈕響應(yīng)均在24077線程,這個(gè)就是JS線程,所以JS線程與UI線程不是同一個(gè)線程。
并且我們嘗試通過sleep方法阻塞JS線程,想觀察JS線程阻塞是否會(huì)影響到UI線程的刷新。最終得出的結(jié)論是無論JS線程sleep多長時(shí)間,UI界面上的progress組件動(dòng)畫一直會(huì)不斷刷新,按鈕也會(huì)有按壓效果變化,所以我們可以推測JS線程與UI線程的相互調(diào)用應(yīng)該是通過某種消息機(jī)制完成的,而不是阻塞式的調(diào)用。
ACE JS框架提供了JS FA(Feature Ability)調(diào)用Java PA(Particle Ability)的機(jī)制,該機(jī)制提供了一種通道來傳遞方法調(diào)用、處理數(shù)據(jù)返回以及訂閱事件上報(bào)。我們同樣制作一個(gè)Demo來驗(yàn)證JS線程與Java PA線程的關(guān)系:
在JS中,我們通過FeatureAbility.callAbility拉起并調(diào)用了名為一個(gè)類名為ServiceAbility的Java PA,并拿到返回結(jié)果:
var action = {};
action.bundleName = <span class="hljs-string">'com.blancwu.test'</span>;
action.abilityName = <span class="hljs-string">'com.blancwu.test.ServiceAbility'</span>;
action.messageCode = <span class="hljs-number">1001</span>;
action.abilityType = <span class="hljs-number">0</span>;
action.syncOption = <span class="hljs-number">0</span>;
console.info(<span class="hljs-string">'FeatureAbility.callAbility begin'</span> + JSON.stringify(action));
FeatureAbility.callAbility(action).then(function (value) {
console.info(<span class="hljs-string">'FeatureAbility.callAbility async result '</span> + JSON.stringify(value));
})
console.info(<span class="hljs-string">'FeatureAbility.callAbility end'</span> + JSON.stringify(action));復(fù)制
在ServiceAbility的onRemoteRequest中增加Log輸出,并sleep 1秒鐘,以便觀察線程情況與之間關(guān)系:
@Override
public boolean onRemoteRequest(int code, MessageParcel data, MessageParcel reply, MessageOption option) throws RemoteException {
HiLog.info(LABEL_LOG, "onRemoteRequest begin " + code);
if (code == 1001) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Map<String, Object> result = new HashMap<String, Object>();
result.put("result", 1);
reply.writeString(ZSONObject.toZSONString(result));
}
HiLog.info(LABEL_LOG, "onRemoteRequest end " + code);
return super.onRemoteRequest(code, data, reply, option);
}復(fù)制
以上代碼完成后,我們進(jìn)行執(zhí)行,得到的Log如下:
?
?
我們觀察到本次運(yùn)行主進(jìn)程(UI線程)號(hào)為4133,JS代碼執(zhí)行在JS線程5887,Java PA響應(yīng)onRemoteRequest執(zhí)行在另一個(gè)后臺(tái)任務(wù)線程5837。通過Log我們看到onRemoteRequst即使阻塞了后臺(tái)任務(wù)線程1s也不會(huì)影響JS線程的并行執(zhí)行以及主線程(UI線程)上動(dòng)畫的刷新,做到了JS線程與后臺(tái)任務(wù)線程異步地執(zhí)行事務(wù)。
上面從代碼實(shí)驗(yàn)角度觀察到了JS線程與其他線程的異步關(guān)系,那么JS線程是怎么處理來自其他多個(gè)線程的調(diào)用的呢?我們先來看一下傳統(tǒng)的瀏覽器環(huán)境下的機(jī)制:
?
?
上圖中,JS線程中的函數(shù)調(diào)用會(huì)存在于棧(stack)中,棧中的函數(shù)可以調(diào)用瀏覽器環(huán)境提供的WebAPIs,包含了DOM、ajax、timeout等API,這些API會(huì)在瀏覽器環(huán)境提供的另外一個(gè)外部線程執(zhí)行,執(zhí)行完成后會(huì)在任務(wù)隊(duì)列(callback queue)中加入對(duì)應(yīng)的回調(diào)事件(如onClick、onLoad、onDone)。當(dāng)棧中的代碼執(zhí)行完畢,即棧清空后,JS線程又會(huì)通過event loop取出任務(wù)隊(duì)列中的下一個(gè)任務(wù)進(jìn)行執(zhí)行,以此類推完成整個(gè)的程序執(zhí)行。更具體的機(jī)制可以去看阮一峰老師介紹JS EventLoop的文章:
● JS EventLoop介紹
http://www.ruanyifeng.com/blog/2014/10/event-loop.html
HarmonyOS ACE開發(fā)框架同樣遵循上述最基本的EventLoop調(diào)度機(jī)制,并且提供了更多的機(jī)制和API,讓業(yè)務(wù)邏輯可以在外部線程執(zhí)行,包含了上面提到的Java PA以及異步回調(diào)的系統(tǒng)能力API。其中,異步回調(diào)的系統(tǒng)能力API包含如文件系統(tǒng)操作和網(wǎng)絡(luò)操作等,具體大家可以按照我們實(shí)驗(yàn)Demo的方法去嘗試一下。
● 參考
https://developer.harmonyos.com/cn/docs/documentation/doc-references/js-apis-file-storage-0000000000629445
目前ACE JS應(yīng)用內(nèi)實(shí)現(xiàn)多線程的最佳方式是通過混合編程調(diào)用Java PA方式,但未來純JS應(yīng)用一定會(huì)越來越多,那么,只支持單線程的JS ACE框架的異步API能解決各種復(fù)雜場景的問題嗎?
單線程的JS加上異步API能夠很好解決單個(gè)I/O阻塞的問題,但是如果遇到大量的I/O事件,比如批刪除大量文件,通過for循環(huán)發(fā)起了大量異步任務(wù),也會(huì)降低執(zhí)行效率,甚至阻塞其他異步任務(wù)的執(zhí)行。并且如果要使用JS語言開發(fā)計(jì)算密集型的任務(wù),也無法在唯一的JS線程上進(jìn)行。
這時(shí)就需要一個(gè)真正的JS多線程處理機(jī)制了,雖然目前HarmonyOS 2還未支持,但未來HarmonyOS會(huì)考慮規(guī)劃出與HTML5類似提供支持WebWorker機(jī)制,支持開發(fā)出多線程的JS代碼,提供給應(yīng)用開發(fā)者更多的發(fā)揮空間。
帖子(轉(zhuǎn)載)描述了一些C/C++中的開源庫,供平時(shí)工作中參考。
如果各位小伙伴有用的方便且好用的庫也請(qǐng)分享上來吧!
1 綜合性的庫
Boost
Home:http://boost.org/
Boost 大概是最重要的第三方 C++ 庫。其作者有很多是 C++ 標(biāo)準(zhǔn)委員會(huì)的成員。Boost 的很多子庫后來都成為 C++ 的標(biāo)準(zhǔn)庫。
本頁面的其它章節(jié)還會(huì)繼續(xù)提及 Boost 在各種領(lǐng)域的應(yīng)用。
wxWidgets
Home:https://wxwidgets.org/
這是一個(gè)非常老牌的 C++ 開源 GUI 框架,誕生于1992年。原先叫做 wxWindows,后來因?yàn)槲④浀姆杉m紛,改為現(xiàn)名。
它支持的操作系統(tǒng)平臺(tái)很多(包括嵌入式系統(tǒng))。
很多開源項(xiàng)目用到它,比如:BitTorrent、aMule、FileZilla、Code::Blocks、Dolphin......
雖然它以 GUI 為主,但是也提供了其它一些輔助功能(比如:進(jìn)程間通訊、網(wǎng)絡(luò)、數(shù)據(jù)庫、多媒體......)
Qt
Home:http://www.qt-project.org/
這是一個(gè)非常老牌的 C++ 開源 GUI 框架,于1995年發(fā)布 1.0 版本。原先由 Trolltech 公司維護(hù),后來該公司被 Nokia 收購。
它支持的操作系統(tǒng)平臺(tái)很多(包括嵌入式系統(tǒng))。
雖然它以 GUI 為主,但是也提供了其它一些輔助功能(比如:網(wǎng)絡(luò)、數(shù)據(jù)庫、多媒體、3D引擎......)
APR(Apache Portable Runtime)
Home:https://apr.apache.org/
這是由 Apache 社區(qū)維護(hù)的 C 開源庫,主要提供操作系統(tǒng)相關(guān)的功能(文件系統(tǒng)、進(jìn)程、線程、用戶、IPC)。此外還提供了一些網(wǎng)絡(luò)相關(guān)的功能。
APR 原先是 Apache Web 服務(wù)器的一個(gè)組成部分,后來獨(dú)立出來,成為一個(gè)單獨(dú)的開源項(xiàng)目。
ACE(Adaptive Communication Environment)
Home:http://www.cse.wustl.edu/~schmidt/ACE.html
這是一個(gè)跨平臺(tái)的 C++ 庫,提供了一套網(wǎng)絡(luò)通訊的框架;另外還支持線程、進(jìn)程和 IPC。
POCO
Home:http://pocoproject.org/
它的名稱源自“POrtable COmponents”,是一個(gè)基于 C++ 的開源庫。
它的功能以網(wǎng)絡(luò)通訊為主,同時(shí)也提供一些其它功能(比如:多線程、進(jìn)程間通訊、數(shù)據(jù)庫、XML、JSON......)
Dlib
Home:http://dlib.net/
誕生于2002年的 C++ 開源庫,提供了非常多的功能(網(wǎng)絡(luò)、多線程、GUI、數(shù)值計(jì)算、圖像處理、數(shù)據(jù)挖掘......)。
它還有一個(gè)特色是:同時(shí)提供了 Python API :)
Crypto++
Home:http://www.cryptopp.com/
它也叫“CryptoPP”或“l(fā)ibcrypto++”,是非常著名的開源加密庫,誕生于1995年。基于 C++ 開發(fā),大量用到模板語法。
雖然它以加密為主,但是也提供了其它一些輔助功能(比如:數(shù)據(jù)壓縮、編碼解碼、計(jì)時(shí)器...)
2 數(shù)據(jù)結(jié)構(gòu) & 算法
2.1 容器
2.1.1 標(biāo)準(zhǔn)容器
std
C++ 98 標(biāo)準(zhǔn)內(nèi)置的 STL 提供了如下容器:
數(shù)組:vector(動(dòng)態(tài)數(shù)組)、valarray(針對(duì)數(shù)值類型特化的 vector)、bitset(儲(chǔ)存比特的【固定】數(shù)組)
鏈表:list(雙向)
隊(duì)列:queue、deque(雙端隊(duì)列)
棧:stack
映射:map(鍵值無重復(fù))、multimap(鍵值可重復(fù))
集合:set(元素?zé)o重復(fù))、multiset(元素可重復(fù))
C++ 11 標(biāo)準(zhǔn)新增了如下容器:
數(shù)組:array(相比 vector,它的 size 是編譯時(shí)【固定】的)
鏈表:forward_list(相比 list,它是【單向】的)
映射:unordered_map、unordered_multimap(相比 map 和 multimap,這倆采用 hash 實(shí)現(xiàn))
集合:unordered_set、unordered_multiset(相比 set 和 multiset,這倆采用 hash 實(shí)現(xiàn))
下面幾個(gè)容器,C++ 標(biāo)準(zhǔn)【沒有】包含,但包含在某些知名的 STL 第三方庫中(比如 SGI 的 STL):
映射:hash_map、hash_multimap(與 unordered_map、unordered_multimap 相同)
集合:hash_set、hash_multiset(與 unordered_set、unordered_multiset 相同)
2.1.2 Lockfree 的容器
Boost.Lockfree
Docs:http://boost.org/libs/lockfree
Boost 前面已經(jīng)介紹過。這是 Boost 的其中一個(gè)子庫,提供了三種 lock-free 的容器(queue、stack、spsc_queue)。最后這種是“環(huán)形緩沖”。
libcds(Concurrent Data Structures)
Home:http://libcds.sourceforge.net/
這是一個(gè)跨平臺(tái)的 C++ 開源庫,提供了若干 lock-free 的容器。它的 2.0.0 版本,代碼重寫以支持 C++ 11 標(biāo)準(zhǔn)。
2.1.3 環(huán)形緩沖
Boost.CircularBuffer
Docs:http://boost.org/libs/circular_buffer
Boost 前面已經(jīng)介紹過。這是 Boost 的其中一個(gè)子庫,提供了“環(huán)形緩沖區(qū)”的模板。
“環(huán)形緩沖區(qū)”可以降低內(nèi)存分配的開銷。
代碼示例
2.1.4 多維數(shù)組
Boost.MultiArray
Docs:http://boost.org/libs/multi_array
Boost 前面已經(jīng)介紹過。這是 Boost 的其中一個(gè)子庫,提供了任意維的數(shù)組。
代碼示例——3維數(shù)組
2.1.5 圖
Boost.Graph
Docs:http://boost.org/libs/graph
Boost 前面已經(jīng)介紹過。這是 Boost 的其中一個(gè)子庫,簡稱 BGL(Boost Graph Library),封裝了“圖”這種數(shù)據(jù)結(jié)構(gòu)。
它提供了與 STL 類似的泛型編程風(fēng)格。
Dlib
Docs:http://dlib.net/graph_tools.html
Dlib 前面已經(jīng)介紹過。它提供了2個(gè)類(graph & directed_graph)封裝“圖”。
2.2 對(duì)容器的操作
(STL 標(biāo)準(zhǔn)庫里面已經(jīng)實(shí)現(xiàn)了很多算法用來操作容器,考慮到本頁面已經(jīng)很長,這里只列舉第三方庫實(shí)現(xiàn)的算法)
Boost.Foreach
Docs:http://boost.org/libs/foreach
Boost 前面已經(jīng)介紹過。這是 Boost 的其中一個(gè)子庫,提供了通用的遍歷,其效果類似于 Python 的 for 循環(huán)語法。
有了它,你在遍歷時(shí)無需聲明迭代器變量,也無需關(guān)心遍歷的容器是何種類型。
代碼示例——遍歷字符串
2.3 字符串處理
2.3.1 字符集
Boost.Locale
Docs:http://boost.org/libs/locale
Boost 前面已經(jīng)介紹過。這是 Boost 的其中一個(gè)子庫,提供了各種“本地化”的功能。其中就包括字符集編碼轉(zhuǎn)換。
代碼示例
POCO.Text
Docs:http://pocoproject.org/docs/package-Foundation.Text.html
POCO 前面已經(jīng)介紹過。它提供了 UTF8/UTF16/UTF32 的轉(zhuǎn)換。
2.3.2 字符串格式化
Boost.Format
Docs:http://boost.org/libs/format
Boost 前面已經(jīng)介紹過。這是 Boost 的其中一個(gè)子庫,提供了“格式化字符串”的功能。相比 ANSI C 的 sprintf() 和 snprintf(),它的格式化功能更強(qiáng)并且更安全。
代碼示例
fmt
Home:https://github.com/fmtlib/fmt
這是一個(gè)輕量級(jí)、類型安全、高性能的字符串格式化庫。它也可以用來替代 C++ 標(biāo)準(zhǔn)庫中的 IOStreams。
代碼示例
2.3.3 正則表達(dá)式
PCRE(Perl Compatible Regular Expressions)
Home:http://www.pcre.org/
這是一個(gè)很老牌的正則表達(dá)式的庫,誕生于1997年。很多知名的開源項(xiàng)目(Apache、PHP、KDE)用到了它。
Boost.Regex
Docs:http://boost.org/libs/regex
Boost 前面已經(jīng)介紹過。這是 Boost 的其中一個(gè)子庫,提供了“正則式”的功能。
注:Boost 的這個(gè)子庫已經(jīng)進(jìn)入 C++ 11 標(biāo)準(zhǔn)。
代碼示例——基于正則式進(jìn)行匹配和替換
re2
Home:https://github.com/google/re2
這是 Google 提供的正則式庫,基于 C++。其 API 使用起來很簡潔。
有多種腳本語言(Python、Ruby、Perl、Node.js、Erlang、OCaml)提供了對(duì)它的封裝。
代碼示例——基于正則式進(jìn)行匹配
Oniguruma(鬼車)
Home:http://www.geocities.jp/kosako3/oniguruma/
來自日本的正則式庫,基于 C 語言。據(jù)說性能很高。
它被用在 Ruby、TextMate、Sublime Text、SubEthaEdit 等軟件上。
POCO.RegExp
Docs:http://pocoproject.org/docs/package-Foundation.RegExp.html
POCO 前面已經(jīng)介紹過。它提供了正則表達(dá)式的封裝類。
Qt.QRegExp
Docs:http://doc.qt.io/qt-4.8/qregexp.html
Qt 前面已經(jīng)介紹過。這是 Qt 中的一個(gè)類,提供了“正則式”的功能。
2.3.4 (其它)
Boost.StringAlgorithms
Docs:http://boost.org/libs/algorithm/string
Boost 前面已經(jīng)介紹過。這是 Boost 的其中一個(gè)子庫,提供了各種字符串的算法(替換、合并、拆分、大小寫轉(zhuǎn)換、trim......)。
代碼示例——字符串合并
Boost.Lexical_Cast
Docs:http://boost.org/libs/lexical_cast
Boost 前面已經(jīng)介紹過。這是 Boost 的其中一個(gè)子庫,提供了各種字符串與其它類型的轉(zhuǎn)換。
注:Boost 的這個(gè)子庫已經(jīng)進(jìn)入 C++ 11 標(biāo)準(zhǔn)。
代碼示例
2.4 內(nèi)存相關(guān)
2.4.1 智能指針
Boost.SmartPointers
Docs:http://boost.org/libs/smart_ptr
Boost 前面已經(jīng)介紹過。這是 Boost 的其中一個(gè)子庫,提供了幾種智能指針。最常用的是“shared_ptr”。
有了智能指針,你就無需操心 new 之后的 delete 了。
注:Boost 的這個(gè)子庫已經(jīng)進(jìn)入 C++ 11 標(biāo)準(zhǔn)。
2.4.2 內(nèi)存池
Boost.Pool
Docs:http://boost.org/libs/pool
Boost 前面已經(jīng)介紹過。這是 Boost 的其中一個(gè)子庫,提供了“內(nèi)存池”的功能。
Dlib
Docs:http://dlib.net/other.html
Dlib 前面已經(jīng)介紹過。它提供了內(nèi)存池(參見文檔中以“memory_manager”開頭的類)。
APR
Docs:https://apr.apache.org/docs/apr/trunk/modules.html
APR 前面已經(jīng)介紹過。它提供了內(nèi)存池的功能。
2.5 時(shí)間 & 日期
Boost.Date_Time
Docs:http://boost.org/libs/date_time
Boost 前面已經(jīng)介紹過。這是 Boost 的其中一個(gè)子庫,提供了針對(duì)“日期 和 時(shí)間”的各種處理。
POCO.DateTime
Docs:http://pocoproject.org/docs/package-Foundation.DateTime.html
POCO 前面已經(jīng)介紹過。它提供了若干個(gè)日期和時(shí)間的封裝類(時(shí)區(qū)轉(zhuǎn)換、格式化字符串、解析時(shí)間字符串)。
2.6 編碼 & 解碼
2.6.1 序列化
Boost.Serialization
Docs:http://boost.org/libs/serialization
Boost 前面已經(jīng)介紹過。這是 Boost 的其中一個(gè)子庫,提供了【可定制的】“序列化”功能。
2.6.2 Base64
Base64 是一組編碼算法的總稱。用于把二進(jìn)制數(shù)據(jù)編碼為文本。
Boost.Serialization
Docs:http://boost.org/libs/serialization
Boost 前面已經(jīng)介紹過。使用前面提到的“Boost.Serialization”,你可以定制采用 Base64 方式進(jìn)行編碼和解碼。
Crypto++
Docs:http://www.cryptopp.com/docs/ref/annotated.html
Crypto++ 前面已經(jīng)介紹過。它提供了6個(gè)類,分別用于 Base64、Base32、Base16 的編碼/解碼。
POCO.Streams
Docs:http://pocoproject.org/docs/package-Foundation.Streams.html
POCO 前面已經(jīng)介紹過。它提供了 Base64 和 Base32 的編碼/解碼。
2.7 (其它)
2.7.1 隨機(jī)數(shù)
std
ANSI C 在 stdlib.h 中提供了隨機(jī)數(shù)生成函數(shù) rand()。使用前記得先用 srand() 函數(shù)播種,否則就傻了。
Boost.Random
Docs:http://boost.org/libs/random
Boost 前面已經(jīng)介紹過。這是 Boost 的其中一個(gè)子庫,提供了“隨機(jī)數(shù)生成”的功能。
相比 ANSI C 的隨機(jī)數(shù)函數(shù),它提供的功能更豐富。
代碼示例
Crypto++
Docs:http://www.cryptopp.com/docs/ref/class_random_number_generator.html
Crypto++ 前面已經(jīng)介紹過。它提供了好幾個(gè)類,用于隨機(jī)數(shù)生成。
2.7.2 UUID
Boost.UUID
Docs:http://boost.org/libs/uuid
Boost 前面已經(jīng)介紹過。這是 Boost 的其中一個(gè)子庫,提供了 UUID 的生成。
代碼示例——生成 UUID
APR
Docs:https://apr.apache.org/docs/apr/trunk/modules.html
APR 前面已經(jīng)介紹過。它提供了 UUID 的生成、格式化成字符串、解析 UUID 字符串。
POCO.UUID
Docs:http://pocoproject.org/docs/package-Foundation.UUID.html
POCO 前面已經(jīng)介紹過。它提供了 UUID 的生成、格式轉(zhuǎn)換。
天介紹一下IDEA的一些炫酷的插件,IDEA強(qiáng)大的插件庫,不僅能給我們帶來一些開發(fā)的便捷,還能體現(xiàn)我們的與眾不同。
打開setting文件選擇Plugins選項(xiàng)
分別是安裝JetBrains插件,第三方插件,本地已下載的插件包。詳情見關(guān)于settings的文章。
http://www.cnblogs.com/jajian/p/8108690.html
1. activate-power-mode 和 Power mode II
根據(jù)Atom的插件activate-power-mode的效果移植到IDEA上
寫代碼是整個(gè)屏幕都在抖動(dòng),activate-power-mode是白的的,Power mode II色彩更酷炫點(diǎn)。
2.Background Image Plus
idea背景修改插件,讓你的idea與眾不同,可以設(shè)置自己喜歡的圖片作為code背景。
安裝成功之后重啟,菜單欄的VIew標(biāo)簽>點(diǎn)擊Set Background Image(沒安裝插件是沒有這個(gè)標(biāo)簽的),在彈框中路由選擇到本地圖片,點(diǎn)擊OK即可。
3.Grep console
自定義日志顏色,idea控制臺(tái)可以彩色顯示各種級(jí)別的log,安裝完成后,在console中右鍵就能打開。
并且可以設(shè)置不同的日志級(jí)別的顯示樣式。
可以直接根據(jù)關(guān)鍵字搜索你想要的,搜索條件是支持正則表達(dá)式的。官網(wǎng)地址
https://plugins.jetbrains.com/idea/plugin/7125-grep-console
4.Free Mybatis plugin
mybatis 插件,讓你的mybatis.xml像java代碼一樣編輯。我們開發(fā)中使用mybatis時(shí)時(shí)長需要通過mapper接口查找對(duì)應(yīng)的xml中的sql語句,該插件方便了我們的操作。
安裝完成重啟IDEA之后,我們會(huì)看到code左側(cè)或多出一列綠色的箭頭,點(diǎn)擊箭頭我們就可以直接定位到xml相應(yīng)文件的位置。
mapper
xml
5.MyBatis Log Plugin
Mybatis現(xiàn)在是java中操作數(shù)據(jù)庫的首選,在開發(fā)的時(shí)候,我們都會(huì)把Mybatis的腳本直接輸出在console中,但是默認(rèn)的情況下,輸出的腳本不是一個(gè)可以直接執(zhí)行的。
如果我們想直接執(zhí)行,還需要在手動(dòng)轉(zhuǎn)化一下。
MyBatis Log Plugin 這款插件是直接將Mybatis執(zhí)行的sql腳本顯示出來,無需處理,可以直接復(fù)制出來執(zhí)行的,如圖:
執(zhí)行程序后,我們可以很清晰的看到我們執(zhí)行了哪些sql腳本,而且腳本可以執(zhí)行拿出來運(yùn)行。
6.String Manipulation
強(qiáng)大的字符串轉(zhuǎn)換工具。使用快捷鍵,Alt+m。
7.Alibaba Java Coding Guidelines
阿里巴巴代碼規(guī)范檢查插件,當(dāng)然規(guī)范可以參考《阿里巴巴Java開發(fā)手冊(cè)》。
8.Lombok
Java語言,每次寫實(shí)體類的時(shí)候都需要寫一大堆的setter,getter,如果bean中的屬性一旦有修改、刪除或增加時(shí),需要重新生成或刪除get/set等方法,給代碼維護(hù)增加負(fù)擔(dān),這也是Java被詬病的一種原因。
Lombok則為我們解決了這些問題,使用了lombok的注解(@Setter,@Getter,@ToString,@@RequiredArgsConstructor,@EqualsAndHashCode或@Data)之后,就不需要編寫或生成get/set等方法,很大程度上減少了代碼量,而且減少了代碼維護(hù)的負(fù)擔(dān)。
安裝完成之后,在應(yīng)用Lombok的時(shí)候注意別忘了需要添加依,maven為例:
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> @Setter @Getter @ToString @EqualsAndHashCode public class People { private String name; private int age; private String male; }
9.Key promoter
Key promoter 是IntelliJ IDEA的快捷鍵提示插件,會(huì)統(tǒng)計(jì)你鼠標(biāo)點(diǎn)擊某個(gè)功能的次數(shù),提示你應(yīng)該用什么快捷鍵,幫助記憶快捷鍵,等熟悉了之后可以關(guān)閉掉這個(gè)插件。
10.Gsonformat
可根據(jù)json數(shù)據(jù)快速生成java實(shí)體類。
自定義個(gè)javaBean(無任何內(nèi)容,就一個(gè)空的類),復(fù)制你要解析的Json,然后alt+insert彈出如下界面或者使用快捷鍵 Alt+S,在里面粘貼剛剛復(fù)制的Json,點(diǎn)擊OK即可。
11.Restfultookit
Spring MVC網(wǎng)頁開發(fā)的時(shí)候,我們都是通過requestmapping的方式來定義頁面的URL地址的,為了找到這個(gè)地址我們一般都是cmd+shift+F的方式進(jìn)行查找,大家都知道,我們URL的命名一個(gè)是類requestmapping+方法requestmapping,查找的時(shí)候還是有那么一點(diǎn)不方便的,restfultookit就能很方便的幫忙進(jìn)行查找。
例如:我要找到/user/add 對(duì)應(yīng)的controller,那么只要Ctrl+斜杠 ,(圖片來自于網(wǎng)絡(luò))
就能直接定位到我們想要的controller。這個(gè)也是真心方便,當(dāng)然restfultookit還為我們提供的其他的功能。根據(jù)我們的controller幫我們生成默認(rèn)的測試數(shù)據(jù),還能直接調(diào)用測試,這個(gè)可以是解決了我們每次postman調(diào)試數(shù)據(jù)時(shí),自己傻傻的組裝數(shù)據(jù)的的操作,這個(gè)更加清晰,比在console找數(shù)據(jù)包要方便多了。(圖片來自于網(wǎng)絡(luò))
12.JRebel
JRebel是一種熱部署生產(chǎn)力工具,修改代碼后不用重新啟動(dòng)程序,所有的更改便可以生效。它跳過了Java開發(fā)中常見的重建、重新啟動(dòng)和重新部署周期。
使用方式參考此處:
https://jingyan.baidu.com/article/ac6a9a5e31417c2b653eace8.html
注:微信不支持外鏈,如需打開請(qǐng)自行復(fù)制鏈接
Gitee
開源中國的碼云插件
https://plugins.jetbrains.com/plugin/8383-gitee
Alibaba Java Coding Guidelines
阿里巴巴出的代碼規(guī)范檢查插件
https://plugins.jetbrains.com/plugin/10046-alibaba-java-coding-guidelines
IDE Features Trainer
IntelliJ IDEA 官方出的學(xué)習(xí)輔助插件
https://plugins.jetbrains.com/plugin/8554?pr=idea
Key promoter
快捷鍵提示
https://plugins.jetbrains.com/plugin/4455?pr=idea
Grep Console
自定義設(shè)置控制臺(tái)輸出顏色
https://plugins.jetbrains.com/idea/plugin/7125-grep-console
String Manipulation
駝峰式命名和下劃線命名交替變化
https://plugins.jetbrains.com/plugin/2162?pr=idea
CheckStyle-IDEA
代碼規(guī)范檢查
https://plugins.jetbrains.com/plugin/1065?pr=idea
FindBugs-IDEA
潛在 Bug 檢查
https://plugins.jetbrains.com/plugin/3847?pr=idea
MetricsReloaded
代碼復(fù)雜度檢查
https://plugins.jetbrains.com/plugin/93?pr=idea
Statistic
代碼統(tǒng)計(jì)
https://plugins.jetbrains.com/plugin/4509?pr=idea
JRebel Plugin
熱部署
https://plugins.jetbrains.com/plugin/?id=4441
CodeGlance
在編輯代碼最右側(cè),顯示一塊代碼小地圖
https://plugins.jetbrains.com/plugin/7275?pr=idea
GsonFormat
把 JSON 字符串直接實(shí)例化成類
https://plugins.jetbrains.com/plugin/7654?pr=idea
Markdown Navigator
書寫 Markdown 文章
https://plugins.jetbrains.com/plugin/7896?pr=idea
Eclipse Code Formatter
使用 Eclipse 的代碼格式化風(fēng)格,在一個(gè)團(tuán)隊(duì)中如果公司有規(guī)定格式化風(fēng)格,這個(gè)可以使用。
https://plugins.jetbrains.com/plugin/6546?pr=idea
Jindent-Source Code Formatter
自定義類、方法、doc、變量注釋模板
http://plugins.jetbrains.com/plugin/2170?pr=idea
Translation
翻譯插件
https://github.com/YiiGuxing/TranslationPlugin
Maven Helper
Maven 輔助插件
https://plugins.jetbrains.com/plugin/7179-maven-helper
Properties to YAML Converter
把 Properties 的配置格式改為 YAML 格式
https://plugins.jetbrains.com/plugin/8000-properties-to-yaml-converter
Git Flow Integration
Git Flow 的圖形界面操作
https://plugins.jetbrains.com/plugin/7315-git-flow-integration
Rainbow Brackets
對(duì)各個(gè)對(duì)稱括號(hào)進(jìn)行著色,方便查看
https://github.com/izhangzhihao/intellij-rainbow-brackets
MybatisX
mybatis 框架輔助(免費(fèi))
https://plugins.jetbrains.com/plugin/10119-mybatisx
Lombok Plugin
Lombok 功能輔助插件
https://plugins.jetbrains.com/plugin/6317-lombok-plugin
.ignore
各類版本控制忽略文件生成工具
https://plugins.jetbrains.com/plugin/7495--ignore
mongo4idea
mongo客戶端
https://github.com/dboissier/mongo4idea
iedis
redis客戶端
https://plugins.jetbrains.com/plugin/9228-iedis
GenerateAllSetter
new POJO類的快速生成 set 方法
https://plugins.jetbrains.com/plugin/9360-generateallsetter
*請(qǐng)認(rèn)真填寫需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。