簡單問題復(fù)雜化了。
創(chuàng)新互聯(lián)主要從事成都網(wǎng)站設(shè)計、成都網(wǎng)站制作、網(wǎng)頁設(shè)計、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)向陽,10多年網(wǎng)站建設(shè)經(jīng)驗,價格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):13518219792
線程池,本身有任務(wù)隊列;
還要用到數(shù)據(jù)隊列;
兩把鎖;
一把數(shù)據(jù)鎖就解決的問題。
自己構(gòu)建一個blockingqueue,注入到m個生產(chǎn)者線程及n個消費者線程中;
生產(chǎn)者線程不停的生產(chǎn),往queue里put(),如果隊列隊列滿了,線程wait掛起;
消費者線程不停的消費,從queue里take(),如過隊列空了,線程自動掛起;
BlockingQueueT queue = new ArrayBlockingQueueT(1000);
for(int i=0;i5;i++)
new ConsumerThread(queue).start();
for(int i=0;i10;i++)
new ProducerThread(queue).start();
不會啊,所謂的高內(nèi)聚低耦合是一種編程方式,高內(nèi)聚指的是編寫的程序要增強類內(nèi)部的耦合性,低耦合值得死盡量降低類之間的關(guān)聯(lián),其價值在于代碼的維護,一個類里面做一些修改不會對整個軟件產(chǎn)生太大的影響,同時增強了軟件的健壯性能,我知道的就這么多
主要有以下方式:
1、RPC(遠(yuǎn)程過程調(diào)用);
2、webservice接口;
3、http接口,RESTful風(fēng)格接口實現(xiàn)很優(yōu)雅;
4、消息中間件,apache kafka、rabbitmq等。
這幾種方式中推薦使用http接口和消息中間件,rpc代碼耦合性太強,webservice過于重量級,http和消息中間件是最近比較流行的。
代碼重構(gòu)(英語:Code refactoring)重構(gòu)就是在不改變軟件系統(tǒng)外部行為的前提下,改善它的內(nèi)部結(jié)構(gòu)。
軟件重構(gòu)需要借助工具完成,重構(gòu)工具能夠修改代碼同時修改所有引用該代碼的地方。在極限編程的方法學(xué)中,重構(gòu)需要單元測試來支持。
java重構(gòu):指程序員對已有程序在盡量不改變接口的前提下,進行重新編寫代碼的工作,一般有以下幾方面:
1、去除已知bug。
2、提高程序運行效率。
3、增加新的功能。
重構(gòu)舉例:(簡化代碼、提升效率)
重構(gòu)前:
if(list != null list.size() 0){
for(int i = 0; i list.size(); i++){
//skip...
}
}
重構(gòu)后
if(list != null){
for(int i = 0, len = list.size(); i len; i++){
//skip...
}
}
何時著手重構(gòu)(Refactoring)
新官上任三把火,開始一個全新??、腳不停蹄、加班加點,一支聲勢浩大的千軍萬"碼"夾裹著程序員激情和扣擊鍵盤的鳴金奮力前行,勢如破竹,攻城掠地,直指"黃龍府"。
開發(fā)經(jīng)理是這支浩浩湯湯代碼隊伍的統(tǒng)帥,他負(fù)責(zé)這支隊伍的命運,當(dāng)齊桓公站在山頂上看到管仲訓(xùn)練的隊伍整齊劃一地前進時,他感嘆說"我有這樣一支軍隊哪里還怕沒有勝利呢?"。但很遺憾,你手中的這支隊伍原本只是散兵游勇,在前進中招兵買馬,不斷壯大,所以隊伍變形在所難免。當(dāng)開發(fā)經(jīng)理發(fā)覺隊伍變形時,也許就是克制住攻克前方山頭的誘惑,停下腳步整頓隊伍的時候了。
Kent Beck提出了"代碼壞味道"的說法,和我們所提出的"隊伍變形"是同樣的意思,隊伍變形的信號是什么呢?以下列述的代碼癥狀就是"隊伍變形"的強烈信號:
·代碼中存在重復(fù)的代碼
中國有118 家整車生產(chǎn)企業(yè),數(shù)量幾乎等于美、日、歐所有汽車廠家數(shù)之和,但是全國的年產(chǎn)量卻不及一個外國大汽車公司的產(chǎn)量。重復(fù)建設(shè)只會導(dǎo)致效率的低效和資源的浪費。
程序代碼更是不能搞重復(fù)建設(shè),如果同一個類中有相同的代碼塊,請把它提煉成類的一個獨立方法,如果不同類中具有相同的代碼,請把它提煉成一個新類,永遠(yuǎn)不要重復(fù)代碼。
·過大的類和過長的方法
過大的類往往是類抽象不合理的結(jié)果,類抽象不合理將降低了代碼的復(fù)用率。方法是類王國中的諸侯國,諸侯國太大勢必動搖中央集權(quán)。過長的方法由于包含的邏輯過于復(fù)雜,錯誤機率將直線上升,而可讀性則直線下降,類的健壯性很容易被打破。當(dāng)看到一個過長的方法時,需要想辦法將其劃分為多個小方法,以便于分而治之。
·牽一毛而需要動全身的修改
當(dāng)你發(fā)現(xiàn)修改一個小功能,或增加一個小功能時,就引發(fā)一次代碼地震,也許是你的設(shè)計抽象度不夠理想,功能代碼太過分散所引起的。
·類之間需要過多的通訊
A類需要調(diào)用B類的過多方法訪問B的內(nèi)部數(shù)據(jù),在關(guān)系上這兩個類顯得有點狎昵,可能這兩個類本應(yīng)該在一起,而不應(yīng)該分家。
·過度耦合的信息鏈
"計算機是這樣一門科學(xué),它相信可以通過添加一個中間層解決任何問題",所以往往中間層會被過多地追加到程序中。如果你在代碼中看到需要獲取一個信息,需要一個類的方法調(diào)用另一個類的方法,層層掛接,就象輸油管一樣節(jié)節(jié)相連。這往往是因為銜接層太多造成的,需要查看就否有可移除的中間層,或是否可以提供更直接的調(diào)用方法。
·各立山頭干革命
如果你發(fā)現(xiàn)有兩個類或兩個方法雖然命名不同但卻擁有相似或相同的功能,你會發(fā)現(xiàn)往往是因為開發(fā)團隊協(xié)調(diào)不夠造成的。筆者曾經(jīng)寫了一個頗好用的字符串處理類,但因為沒有及時通告團隊其他人員,后來發(fā)現(xiàn)項目中居然有三個字符串處理類。革命資源是珍貴的,我們不應(yīng)各立山頭干革命。
·不完美的設(shè)計
在筆者剛完成的一個比對報警項目中,曾安排阿朱開發(fā)報警模塊,即通過Socket向指定的短信平臺、語音平臺及客戶端報警器插件發(fā)送報警報文信息,阿朱出色地完成了這項任務(wù)。后來用戶又提出了實時比對的需求,即要求第三方系統(tǒng)以報文形式向比對報警系統(tǒng)發(fā)送請求,比對報警系統(tǒng)接收并響應(yīng)這個請求。這又需要用到Socket報文通訊,由于原來的設(shè)計沒有將報文通訊模塊獨立出來,所以無法復(fù)用阿朱開發(fā)的代碼。后來我及時調(diào)整了這個設(shè)計,新增了一個報文收發(fā)模塊,使系統(tǒng)所有的對外通訊都復(fù)用這個模塊,系統(tǒng)的整體設(shè)計也顯得更加合理。
每個系統(tǒng)都或多或少存在不完美的設(shè)計,剛開始可能注意不到,到后來才會慢慢凸顯出來,此時唯有勇于更改才是最好的出路。
·缺少必要的注釋
雖然許多軟件工程的書籍常提醒程序員需要防止過多注釋,但這個擔(dān)心好象并沒有什么必要。往往程序員更感興趣的是功能實現(xiàn)而非代碼注釋,因為前者更能帶來成就感,所以代碼注釋往往不是過多而是過少,過于簡單。人的記憶曲線下降的坡度是陡得嚇人的,當(dāng)過了一段時間后再回頭補注釋時,很容易發(fā)生"提筆忘字,愈言且止"的情形。
曾在網(wǎng)上看到過微軟的代碼注釋,其詳盡程度讓人嘆為觀止,也從中體悟到了微軟成功的一個經(jīng)驗。