2020年春晚將應用5G、8K等創新技術

新華社北京1月14日電(記者余俊傑)中央廣播電視總台14日在京舉行2020年春節聯歡晚會創新應用啟動儀式,將利用5G、8K、4K和VR等新技術為觀眾帶來全新觀看體驗。

據介紹,基於5G網絡的移動拍攝和景觀等機位的4K信號,都將接入春晚製作系統,為春晚全4K智能直播提供技術支持。同時,總台還將採用5G+8K技術實現多機位拍攝,並製作8K版春晚。

本站聲明:網站內容來源於裝修網http://et.21cn.com/,如有侵權,請聯繫我們

【其他文章推薦】

※想知道台北團體制服哪裡比較便宜嗎?

※專業台北團體服訂制、設計一條龍服務!

※住宿攻略懶人包,精選平價舒適一中街住宿,一中街民宿出遊的休息好去處!

※2020票選台東必買 最佳節慶送禮、年節伴手禮,釋迦禮盒,小農禮盒深受國人的青睞!

※各類招牌、海報、大圖輸出,急件製作施工!

《魅力絲路·隴上行》音樂會在薩拉熱窩舉行

新華社薩拉熱窩1月11日電(記者張修智)甘肅省歌舞劇院《魅力絲路·隴上行》民族交響樂音樂會11日晚在波黑首都薩拉熱窩國家劇院舉行,精彩的演出給到場的數百名觀眾帶來一個沉醉的夜晚。

音樂會分《多彩甘肅》《魅力絲路》兩部分,共12個曲目組成。《慶典》《花兒隨想》《阿拉木汗》等帶有濃郁民族風的旋律,讓在場觀眾聽得心潮澎湃,他們對每首曲目都報以熱烈的掌聲。面對意猶未盡的觀眾,在樂隊兩次追加曲目后,音樂會才拉上帷幕。

中國駐波黑大使季平出席音樂會並致辭。前南斯拉夫聯邦主席團主席迪茲達雷維奇等波黑政要、多國駐波外交官及華僑華人出席了音樂會。

波黑軍隊國際維和培訓中心主任巴伊拉莫維奇與妻子、女兒一道觀看了演出,一家人對音樂會贊不絕口。十幾歲的女兒表示,中國民族音樂具有神奇的魅力。

本場音樂會是2020年“歡樂春節”系列演出的一部分,由中國駐波黑大使館主辦,甘肅省文化和旅遊廳承辦。12日,《魅力絲路·隴上行》音樂會還將在波黑旅遊名城莫斯塔爾舉行。(完)

本站聲明:網站內容來源於裝修網http://et.21cn.com/,如有侵權,請聯繫我們

【其他文章推薦】

桃園結婚包套幫你量身打造,最懂待嫁女兒心!

桃園機場接送24小時待命,專業推薦!

婚禮影片不NG,婚禮錄影mv精彩重現讓賓客感動熱議

台北桃園機場接送,網友超推,CP值超高,安全,寬敞又舒適

※新娘必看!桃園自助婚紗推薦名單

※住宿攻略懶人包,精選平價舒適一中街住宿,一中街民宿出遊的休息好去處!

分娩前的疑問:產前真假產痛的區別在哪?

懷孕10個月,一朝分娩,怎樣來區分真假產前陣痛呢?

Q:如何區分真的陣痛和假信號?

A:有一種簡單的測試方法:躺在水溫不要過高的浴盆里,“準備式”陣痛會在水中停止,而真正的分娩陣痛則會變得更強烈。由於這個測試應該在臨近預產期的時間做,因此,能夠準確地區分是否真的陣痛來臨了。

* 在醫院,助產士和醫生還會在這個時候,通過檢查子宮由於收縮是否發生了變化來確定寶寶是否準備好了。

Q:何謂早期破水?

A:早期破水是指孕婦不管是否已足月,在還沒有真正進入產程之前,包在胎兒外的胎膜(羊膜)就發生自然破裂,羊水流出,胎兒失去羊膜的保護。

Q:是什麼原因引起?發生的比例?

A:發生早期破水的原因並不是很明確。健康完好的羊膜具有很好的韌性,但當內外在環境改變時,可能會造成羊膜的某一點抗壓性降低,而形成一個壓力出口,這些情況包括感染、子宮頸的閉鎖不全、羊水過多症、胎位不正、外傷外力的壓迫和多胞胎妊娠等,也有部分並無明顯的原因。據不同中心的統計,發生率大約佔所有生產的10%左右。

Q:對孕婦會有危險嗎?

A:破水本身對孕婦是沒有危險,但應試圖找出導致破水的原因加以處理。例如是否有感染髮生?孕婦是否是一個高危險妊娠狀態?若是,則應做適當的處置。

Q:對寶寶會有危險嗎?

A:足月

要看破水時的周數和原因而定。若破水時妊娠都超過37-38周,已可算是足月兒,若無明顯感染癥狀如發燒、胎心加速、驗血白血球升高等情況,自然情況下九成會在24小時內發生陣痛,高達九成會在两天內出生。

未足月

若未滿36周或更早,則要考慮到早產所并行的問題,此時比較會對小寶寶造成危險。若有感染的情形,可立即用抗生素治療,但有時早產造成的危險比感染還嚴重。

特別提醒

另一種情況比較危急的是已生過小孩的經產婦,有時破水並子宮頸開,臍帶若隨着羊水往外流出,會造成臍帶脫出,血流入胎兒會受阻,會造成胎兒窘迫,就非常危險了!所幸這樣的情況並不常見。

: 分娩期相關

本站聲明:網站內容來源媽咪愛嬰網http://www.baby611.com,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※2020桃園婚紗攝影推薦一流團隊

※婚禮籌備好崩潰!該找婚攝還是婚錄?新人必備教戰守則

※月子中心貴鬆鬆,找對到府月嫂省一半,更讓你事半功倍!!

台東人氣名產台東人氣伴手禮,熱門獨家商品,現貨供應中

※新娘必看!桃園自助婚紗推薦名單

輕鬆分娩:無痛分娩重要的三要素

孕婦坐着或躺着,慢慢用鼻子深深吸氣,再慢慢從口裡呼出,就像吹蠟燭一樣。每天練習一次,每次15~20分鐘。

練呼吸能減痛報名熱線打爆

“拉瑪澤減痛分娩法”是一種來自法國的心理預防式自然分娩法,讓准媽媽從懷孕7個月後開始練習呼吸、控制肌肉,轉移疼痛。這種方法,第一次生孩子的時間可以從平均十五六個小時縮短到7個半小時。

“練習呼吸,是針對自然分娩的。及早學會這一方法,能通過轉移注意力來減輕疼痛。”該科主任崔世紅說,“練呼吸是學習的中心。”

為讓記者搞清其中原理,劉愛清介紹了一種基本呼吸方法,生孩子的整個過程都要用——廓清式呼吸。孕婦坐着或躺着,慢慢用鼻子深深吸氣,再慢慢從口裡呼出,就像吹蠟燭一樣。每天練習一次,每次15~20分鐘。

多種無痛分娩減輕生子之痛

其實,在追求無痛分娩的歷程中,這並非新鮮事,早在1986年,綜合性無痛分娩技術已在我省多家醫院使用。那時主要是運用藥物進行局部麻醉,使產婦減輕疼痛的感覺。省人民醫院婦產科凌蕭鳴主任醫師說,過去,為達到無痛,醫生一般使用非藥物鎮痛和藥物鎮痛兩種形式。如產前教育、心理暗示、呼吸調節及局部麻醉和硬脊膜外腔麻醉等。

“無痛分娩是產婦和產科醫生的共同願望,但想一點不痛是不可能的。”崔世紅說,“在順產時,產婦疼痛是與胎兒的大小、產婦骨盆的大小及形狀、產婦陰道肌肉的彈力和產婦的精神狀態密切相關的。”為幫產婦減輕疼痛,醫院做出了不少嘗試。如圍產期檢查、教產婦做體操等。該院力推的“拉瑪澤減痛分娩法”,主要通過呼吸調節精神,成為無痛分娩的最新亮點。

醫生倡言分娩疼痛值得體驗

“分娩時的疼痛是女人一生中值得體驗的事,疼痛本身是生理性的,若是人為地干涉,反而破壞和諧。”鄭大二附院婦產科主任醫師李小姝說,目前,生活條件好了,巨大兒的比例不斷提高,這也是剖宮產增加的一個原因。

“鼓勵自然分娩,盡量減少藥物等醫療手段干預產程,藥物麻醉、吸笑氣只是減痛,也不是絕對的無痛。”鄭大一附院臨產室護士長張連琴說,在生產前助產士會用鼓勵產婦、教其如何深呼吸、給其按摩腰骶部等方法來幫助產婦減輕疼痛。

“藥物減輕產程的疼痛,一定要在宮口開大2~3厘米時才可以用,不影響子宮收縮,若宮口開得太大,就不能用了。”鄭大一附院產科主任醫師楊玲竹說,至於藥物對產婦和嬰兒有無影響還沒有依據,從臨床上觀察問題不大。

無痛分娩三要素缺一不可

“我們對順產都喪失信心了,只等着剖宮產了。可醫生堅持讓試試。這不,也不怎麼痛,我的寶貝妞妞順產生下。”躺在鄭大三附院的病床上,24歲的閻女士高興地說。身邊,一個女嬰在熟睡。

閻女士身材瘦削,臨產前檢查,胎兒應在3700克左右,屬體型較大。夫妻倆對順產沒有信心,甚至他們都專門找過醫生,安排好了剖宮產日期。但護士長劉愛清說:“你現在的身體條件並不符合剖宮產指征,是不是試着順產?”正是這句話讓閻女士樹立起了順產的信心。在生產中,遵從醫護人員的要求,她將疼痛的注意力轉移到了呼吸上,“參加‘拉瑪澤減痛分娩法’培訓,果然疼痛減輕了許多。”閻女士高興地說。

像她這樣幸福的順產母親不在少數,據了解,在記者採訪的當晚,該院共出生6個嬰兒,5個都是順產。閻女士說,“無痛分娩,醫生的理念、分娩環境和呼吸配合三要素缺一不可。”

做“拉瑪澤減痛分娩法”練習時,要放鬆,准爸爸可以幫着喊口令。比如:產痛——廓清式呼吸——縮緊右臂(四肢都可以)——放鬆——廓清式呼吸。這麼做是讓准媽媽產生條件反射,一方面分散對疼痛的注意力,同時也放鬆肌肉,保持體力。

: 分娩期相關

本站聲明:網站內容來源媽咪愛嬰網http://www.baby611.com,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※想知道真正好吃不黏牙的牛軋糖在哪嗎?

※全國票選五大台東必買台東伴手禮最佳商品哪裡買的到?

※專業婚禮錄影團隊,用鏡頭記錄人生中值得紀念的一刻!

※婚禮大小事,新人分享高CP值桃園婚紗

※2020票選台東必買 最佳節慶送禮、年節伴手禮,釋迦禮盒,小農禮盒深受國人的青睞!

桃園機場接送24小時待命,專業推薦!

輕鬆分娩:孕婦分娩技巧

十月懷胎一朝分娩。每當產期臨近,准媽媽難免會心裏緊張,不知所措,其實大可不必。

首先識別分娩的先兆。正式臨產前,孕婦往往會出現一些癥狀,預示着即將正式臨產,如不規則子宮收縮,常在夜間出現而白天消失,每次間隔時間可長可短,每次持續時間不長於30秒,孕婦可感到輕微腰酸,下腹輕微脹痛。正式臨產前1—2天陰道出現少量血性粘液自陰道流出,稱為見紅。有些孕婦可於正式臨產前發生胎膜破裂,羊水自陰道流出,此時孕婦應卧床,立即到醫院就診,特別是臀位的產婦,要預防臍帶脫垂。

由於人們對分娩的不正確認識,致使普遍存在對分娩所產生的疼痛的恐懼,恐懼則會導致緊張,緊張更加劇了疼痛,這就直接影響分娩的進程,並對產婦的心理產生影響。其實,我們可以通過以下一些技巧來應對。

一是臨產後由家人陪伴,由助產士指導,分散注意力,一起扯一扯產婦感興趣的話題,並講解分娩的過程,使產婦掌握分娩知識,有效地緩解分娩過程中的不適,從而降低對宮縮的感受力。

二是調節呼吸的頻率和節律,當運動或精神緊張時,呼吸頻率就加劇,主動調整呼吸的頻率和節律,可緩解由於分娩所產生的壓力,增強產婦的自我控制意識,當轉移注意力的方法不能幫助產婦緩解分娩的不適時,可選擇慢-胸式呼吸,呼吸的頻率調整為正常的1/2,隨着宮縮頻率和強度的增加則可選擇淺式呼吸,其頻率為正常呼吸的2倍,不適達到最強的程度選用喘吹式呼吸:4次短淺呼吸后吹一口氣。

三是適當採用一些可令產婦放鬆的技巧。如由家屬或助產士觸摸產婦緊張部位,並指導其放鬆,反覆的表揚鼓勵產婦並講解進展情況,必要時可使用笑氣鎮痛。對有一定音樂欣賞能力的產婦選擇舒緩的音樂放鬆。

當宮口開全時,產婦疼痛有所緩解,有種大便感,工作人員會指導產婦屏氣用力的正確方法,此時產婦要調整自己的心理和體力,积極配合,正確用力,以加速產程進展,否則消耗體力影響產程進展而使產程延長,胎兒易發生宮內窒息及顱內出血。

: 分娩期相關

本站聲明:網站內容來源媽咪愛嬰網http://www.baby611.com,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

桃園機場租車可以要求甲租乙還服務?

※2020人氣涮嘴零食【牛軋糖】票選為最佳送禮熱賣商品

※省錢度蜜月!想知道哪裡可以找到最優惠的桃園婚紗工作室呢?

台東人氣名產台東人氣伴手禮,熱門獨家商品,現貨供應中

※“上班這黨事”節目推薦牛軋糖,辦公涮嘴零食NO.1

剖宮雙面性分析

近年來,全國各地特別是城市醫院剖腹產分娩的發生率迅速上升,有些醫院佔住院分娩總數的20%,甚至更高。本文就剖宮產的利與弊和朋友們進行交流。

從上個世紀90年代末開始,我國突然興起了剖宮產熱。有人錯誤地認為,剖宮分娩既可以避免幾個甚至十幾個小時子宮收縮陣痛的“痛苦”,又可以保證安全,何樂而不為呢?目前,這種情況,城市明顯多於農村。但實踐證明,剖宮產率的升高並不能進一步降低圍產兒發病率及死亡率,反而增加了產婦的併發症。

剖宮產術的適應證分難產和非難產兩大類:難產指包括凡由於產道、胎兒或產力異常所致難產的孕婦,如骨盆狹窄、胎兒過大、胎位或胎頭位置異常、宮縮乏力、子宮有疤痕、生殖道有畸形或腫瘤阻礙產道等;非難產指包括孕婦或胎兒有併發症危及生命,必須採用剖宮產以急速結束分娩。因此剖宮產在處理一些緊急情況如胎盤早剝、各種難產、宮內窒息等時,為搶救母嬰生命起到积極的、決定性的作用,保證了特殊情況下母嬰的安全,降低了孕產婦及圍產兒的死亡率,其最大的好處就是在危險的狀況下獲得了一個健康的孩子。剖宮產本是一種解決難產和解救胎兒的手段,現在卻被當作正常的生產手段備受青睞,主要是由於對分娩認識不足,一些產婦和家屬因某些片面觀點而選擇剖宮產:怕痛而拒絕試產;害怕產後陰道變鬆弛,影響性生活;顧慮試產失敗后再開刀“受兩次罪”;誤認為剖宮產的孩子聰明。這些都是准父母對剖宮產認識的一些誤區。那麼剖宮產究竟對母兒有哪些不利影響呢?

剖宮產對母親的不利影響:

①剖宮產是一種手術,手術中出血比自然分娩多,有可能出現手術併發症:如膀胱及輸尿管、腸管的損傷。術后易出現發熱、腹脹、刀口出血、血腫、刀口感染、術后尿瀦留、腸粘連等。②剖宮產會給產婦子宮留下永久性的疤痕,這種子宮在醫學上稱“疤痕子宮”“疤痕子宮”在兩年內再妊娠容易發生胎盤植入、胎盤粘連,分娩時易發生子宮破裂、胎盤剝離不全,因此剖宮產再次妊娠者一般仍需剖宮產術,第二次手術要比第一次手術困難,更增加了術后併發症的發生機會。③剖宮產者在避孕方面也受一定的限制,避孕失敗施行人工流產時容易發生子宮穿孔。④在遠期術后複查中,慢性附件炎、月經不調、腰痛等病症的發生率明顯高於陰道分娩者,甚至發生腹腔粘連,腹壁刀口子宮內膜異位症等。⑤剖宮產術后,因怕刀口痛,不能及時下床活動,進而影響了產後身體的恢復及子宮復原。有些產婦因剖宮產後卧床休息時間較長,易形成下肢及盆腔深靜脈血栓,如栓子脫落則可引起心肺腦等重要臟器的栓塞而危及生命。⑥住院時間長,用藥多,費用增加,產後恢復慢。

剖宮產對嬰兒的不利影響

①由於胎兒在出生時沒有經過產道擠壓,胎兒氣道內的黏液未受擠壓排出,肺部沒有經過鍛煉,肺功能可能不健全,出生后不易適應外界環境的驟變,易發生新生兒窒息、呼吸窘迫綜合征,甚至導致出生后濕肺、新生兒肺炎等疾病。②對新生兒的遠期影響:剖宮產兒不像陰道產兒在限定時間內能順勢通過產道各個平面,並連續完成銜接、下降、俯屈、內旋轉、仰伸等動作。胎兒娩出產道的各個動作即為“感覺統合”。也就是說,陰道分娩的過程中在神經體液調節下,胎兒受到宮縮、產道適度的物理張力改變,身體、胸腹、胎頭有節奏地被擠壓,這種刺激信息被外周神經傳遞到中樞神經系統,形成有效的組合和反饋處理,使胎兒能以最佳的姿勢、最小的徑線、最小的阻力順應產軸曲線而下,最終娩出。而剖宮產卻屬於一種干預性分娩,絕沒有胎兒的主動參与,完全是被動地在短時間內被迅速娩出。正因為剖宮產兒未曾適應這些必要的刺激、考驗,有的就表現為本體感和本位感差。任何原因使感覺刺激信息不能在中樞神經系統進行有效率的組合,則整個身體不能和諧有效地運作就稱為“感覺統合失調”。“感覺統合失調”中,前庭信息處理不良佔一大部分,因此推論部分剖宮產兒日後有可能存在定位差,注意力不易集中,多動及閱讀、畫線、打球有困難等遠期影響。

總之,胎兒在發育成熟的情況下自然出生是最健康的分娩方式,提前分娩甚至早產可能影響新生兒的生存能力,嚴重的會影響其發育和智力等。俗話說“瓜熟蒂落”,沒有必要趕着“好日子”剖腹生寶寶。一味地為了求吉日、選日子進行剖宮產對胎兒和孕婦都是有害無益的。在醫學上,剖宮產是有條件的,也是有一定風險的。產科醫生會恰當地掌握手術指征和手術時機施行手術,也會將應該承擔的手術風險告知產婦及其家屬。因此,建議准爸爸准媽媽們不要隨便選擇孩子出生的時間,順其自然最好。

: 分娩期相關

本站聲明:網站內容來源媽咪愛嬰網http://www.baby611.com,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

專車接送服務省時省力還可以預約喔!

台東名產,台東美食吃透透,網購票選人氣NO.1商品,快速滿足您的味蕾!

※待嫁娘分享桃園婚紗工作室推薦精選攝影作品

※過年送禮好選擇【牛軋糖】,連外國人都驚豔

桃園機場接送24小時待命,專業推薦!

6個方法讓你準確計算受孕時間

醫學上規定,以末次月經的第一天起計算預產期,其整個孕期共為280天,10個妊娠月(每個妊娠月為28天),孕婦在妊娠38-42周內分娩,均為足月。那麼具體孕產期怎麼算呢?

1:根據末次月經計算

末次月經日期的月份加9或減3,為預產期月份數;天數加7,為預產期日。例如:末次月經是2008年7月17日,其預產期約為:2009年4月24日。此外,也可以從末次月經第一天起向後推算到第280天就是預產期。

2:根據胎動日期計算

如你記不清末次月經日期,可以依據胎動日期來進行推算。一般胎動開始於懷孕后的18-20周。計算方法為:

第一次懷孕的媽咪預產期=自覺胎動日期+22周;

已經生產過的媽咪預產期=自覺胎動日期+24周。

3:根據基礎體溫曲線計算

將基礎體溫曲線的低溫段的最後一天作為排卵日,從排卵日向後推算264-268天,或加38周。

4:根據早孕反應日期計算

如果准媽媽的月經周期並不是很規律,或者准媽媽們忘記了末次月經的時間,但是還記得何時出現噁心、嘔吐等早孕反應,那麼這個方法就蠻適用的,可以用來計算您的預產期。因為一般情況來說,早孕反應出現的時間大約是在懷孕后的第6周左右,所以,預產期=早孕反應出現的日期+34周。

5:根據B超檢查結果計算

在妊娠期間,孕媽咪們都會去醫院做B超檢查,以檢查寶寶是否身體健康。在檢查報告單上,我們總會看以一些讓人超頭大的數據代碼。如果你是專業的醫師或者你可以請醫生,根據B超單上的這些數據估算出寶寶的胎齡,並進而推算出預產期來。

6:根據子宮底高度大致估計

如果末次月經日期記不清,可以按子宮底高度大致估計預產期。妊娠四月末,子宮高度在肚臍與恥骨上緣當中(恥骨聯合上10厘米);妊娠五月末,子宮底在臍下2橫指(恥骨上16-17厘米);妊娠六月末,子宮底平肚臍(恥骨上19-20厘米);妊娠七月末,子宮底在臍上三橫指(恥骨上22-23厘米);妊娠八個月末,子宮底的劍突與臍的正中(恥上24-25厘米);妊娠九月末,子宮底在劍突下2橫指(恥骨上28-30厘米);妊娠十個月末,子宮底高度又恢復到八個月時的高度,但腹圍比八個月時大。

: 預產期相關

本站聲明:網站內容來源媽咪愛嬰網http://www.baby611.com,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

機場接送價格哪一家車行最便宜~

※2020票選台東必買 最佳節慶送禮、年節伴手禮,釋迦禮盒,小農禮盒深受國人的青睞!

※月子婆好幫手!桃園到府坐月子專業達人教你選擇月嫂該了解的6件事!

※超熱門!桃園婚紗店外拍推薦景點,激發你的拍照魂!

※婚禮籌備好崩潰!該找婚攝還是婚錄?新人必備教戰守則

※超人氣NO.1 台中一中住宿,台中一中民宿近商圈步行只要幾分鐘!

千萬級用戶網站門戶前端設計

      對於千萬級的註冊用戶的門戶項目是前端這塊是怎麼去實現的,自己在平常的工作中總結了一些經驗,也是在不斷的挫折中,不斷演練的,希望總結出來給大家參考下,和大家一起探討,一起進步。

 

一、門戶設計一般會遇到哪些難點

(一)、首頁打開時間太慢了

        在開發一個門戶到生產上線后,首頁響應時間是檢驗門戶整個系統架構以及開發的重要的一項指標,有時候我們發現在公司測試發現速度都挺快的,怎麼到生產首頁打開就慢了呢?

(二)、頁面加載不流暢,總感覺看着不舒服

       因為門戶一般都是偏向於內容和圖片類資源比較多,但是我們打開自己的網頁,有時候總感覺加載並不是按照我們期望的那樣加載得到,順其自然,總感覺看起來怪怪的。

(三)、希望用戶緩存的地方未進行緩存

       很多靜態的前端資源,其實在系統未進行更新時候,第一次加載之後,希望緩存到用戶的本地,但是因為緩存策略沒搞好,經常未進行有效的緩存。

(四)、頁面的頭部尾部經常需要被第三方嵌入

      因為作為一個比較大的門戶站點,可能會讓很多小的服務接入進來,但是頭部和尾部因為是需要保持風格統一,所以經常需要被第三方進行嵌入。

(五)、代碼沒有進行有效的壓縮,導致被竊取

     因為作為門戶站點,前端如果不進行加密的話,代碼很容易被別人進行抄襲偽造,而且還很容易清楚裏面的業務邏輯,從而很容易仿造和進行攻擊。

(六)、增量靜態資源發布

     經常門戶線上環境需要增加一點小功能,但是我們又不想去整個版本的迭代更新,這時候我們可能需要增量更新一部分代碼,但是因為加密壓縮,這時候該怎麼解決呢?

(七)、門戶的輪播圖,運營位圖片那麼多,該怎麼提升加載速度呢?

     我們經常在門戶上面能看到很多的圖片,但是這些圖片卻大大的拖慢了整個網站的加載速度,怎樣去很好的處理這些圖片資源呢,你考慮過么?

(八)、大家都知道門戶需要做靜態化,但是靜態化方案那麼多,哪一種合適呢?

     門戶的靜態方案隨着前端技術的發展,從最開始的freemark等後端java類模板,到客戶端的渲染模板,但是他們各自有什麼優勢?該怎麼選型?

(九)、需要開發多端,工作量大

 

二、整體設計

 

設計圖 基礎架構

上圖主要說明了大型門戶中常用到的一些技術,說明如下:

(一)、CDN :

        假設我們的服務器都部署在合肥的機房,對於安徽的用戶來說訪問是較快的,而對於新疆的用戶訪問是較慢的,這是由於合肥和新疆分別屬於電信和聯通的不同發達地區,新疆用戶訪問需要通過互聯路由器經過較長的路徑才能訪問到合肥的服務器,返迴路徑也一樣,所以數據傳輸時間比較長。對於這種情況,常常使用CDN解決,CDN將數據內容緩存到運營商的機房,用戶訪問時先從最近的運營商獲取數據,這樣大大減少了網絡訪問的路徑。

(二)、反向代理 :

        部署在網站的機房,當用戶請求達到時首先訪問反向代理服務器,反向代理服務器將緩存的數據返回給用戶,如果沒有緩存數據才會繼續訪問應用服務器獲取,這樣做減少了獲取數據的成本。反向代理常用Nginx。

(三)、硬負載 :

        應用服務器作為網站的入口,會承擔大量的請求,我們往往通過應用服務器集群來分擔請求數。應用服務器前面部署負載均衡服務器調度用戶請求,根據分發策略將請求分發到多個應用服務器節點。

其中包括硬負載和軟負載,硬負載常用的負載均衡技術硬件的有F5,價格比較貴一般都在15W以上。軟件的有LVS、Nginx、HAProxy。LVS是四層(傳輸層)負載均衡。

(四)、使用NoSql數據庫和搜索引擎

       對於海量數據的查詢和分析,我們使用nosql數據庫加上搜索引擎可以達到更好的性能。並不是所有的數據都要放在關係型數據中。常用的NOSQL有mongodb、hbase、redis,搜索引擎有lucene、solr、elasticsearch。

(五)、 消息隊列

       隨着業務的擴展,應用程序變得非常臃腫,這時我們需要將應用程序進行業務拆分。每個業務應用負責相對獨立的業務運作。業務之間通過消息進行通信或者共享數據庫來實現。

(六)、分佈式文件系統

       用戶一天天增加,業務量越來越大,產生的文件越來越多,單台的文件服務器已經不能滿足需求,這時就需要分佈式文件系統的支撐。常用的分佈式文件系統有GFS、HDFS、TFS。而我們業務線主要用FASTDFS。

    

三、前端功能性設計

(一)、多頁和單頁的選擇

   門戶網站推薦使用多頁架構。

理由如下:

   多頁項目,頁面和頁面之間是獨立的,不存在交互,因此當一個頁面需要單獨重構時,不會影響其他頁面,對於有長期歷史的項目來說,可維護性、可重構性要高很多;

多頁項目可以單次只更新一個頁面的版本,而單頁項目如果其中一個功能模塊要更新(特別是公共組件更新),很容易讓所有頁面都需要更新版本;

多頁項目的版本控制更簡單,如果需要頁面拆分,調整部分頁面的使用流程,難度也會更低;

灰度發布更友好;

優點:

    1、降低長期項目迭代維護的難度;

    2、方便增量資源更新,以及緩存內容按照頁面緩存,不會整體緩存。

(二)、考慮多端,並規範多端共用一套接口,註冊接口平台服務

常見方案如下:

後端提供的接口,應該同時考慮包含PC和H5的數據(即單獨對一個存在亢餘數據);

    接口應當穩定,即當業務變更時,應盡量採取追加數據的形式;

    只有在單獨一端需要特殊業務流程時,設計單端獨有接口;

    多端共用接口,是減少開發工作量,並且提高業務可維護性的重要解決方案。

優點:

    1、降低開發工作量,增強可維護性。

    2、頁面可以通過響應式設計,部分頁面可以減少開發工作量。

 

(三)、負載均衡使用nginx

   負載均衡通常使用Nginx比較多。當遇見大型項目的時候,負載均衡和分佈式幾乎是必須的。前端主要是對於靜態資源服務來說,負載均衡有以下好處:

降低單台server的壓力,提高業務承載能力;

方便應對峰值流量,擴容方便(如舉辦某些活動時);

增強業務的可用性、擴展性、穩定性;

負載均衡已經是蠻常見的技術了,好處不用多說,很容易理解。

優點:

   1、增強業務的可用性、擴展性、穩定性,可以支持更多用戶的訪問。

   2、通過靜態資源代理,可以增加緩存,提升加載速度。

 

(四)、考慮使用CDN

   用戶來自不同地區,加入CDN可以使用戶訪問資源時,訪問離自己比較近的CDN服務器,降低訪問延遲;

降低服務器帶寬使用成本;

支持視頻、靜態資源、大文件、小文件、直播等多種業務場景;

消除跨運營商造成的網絡速度較慢的問題;

降低DDOS攻擊造成的對網站的影響;

CDN是一種比較成熟的技術,各大雲平_台都有提供CDN服務,價格也不貴,因此CDN的性價比很高。

優點:

   1、增加用戶訪問速度,降低網絡延遲,帶寬優化,減少服務器負載,增強對攻擊的抵抗能力。

 

(五)、前後端分離

   建議前端負責所有靜態資源的開發,後端負責所有服務的開發;前端通過前端工程化來完成前端靜態資源的編譯和處理工作,同時像VUE等腳手架也提供了工具。

優點:

   1、更規範的進行頁面管理,降低頁面和功能的耦合度,減少複雜頁面的環境配置時間,以及方便欄目拼接。

   2、方便進行頁面的工程化處理,包括合併,壓縮,加密等;

 

(六)、支撐內容和欄目可以配置

    提供內容和欄目渲染的基礎組件,支持這些可復用的內容可以進行可配置,減少後期運維的成本。

   門戶開發前期,一定要梳理出後期可能調整的地方,從而最大限度的進行配置。

優點:

   1、 頁面調整時候更加靈活,方便定製化;

(八)、靜態化;

   能夠對數據進行靜態化,在服務端進行頁面的渲染。

正常情況調用接口接口,異常轉向靜態數據。

可以通過靜態頁存儲,採用定時更新機制減輕服務器負擔,首頁每個小模塊可以通過oscache進行緩存,這樣不用每次拉數據。

優點:

   1、 能夠很大程度上提升頁面以及首頁的加載速度;

(九)、緩存機制

對頭部導航、用戶信息等內容進行緩存,靜態的數據進行緩存,定期更新。

常見解決方案:

直接將資源文件名使用文件摘要或者說某個固定的字符串加上一個文件摘要拼接成一個文件名。

 

好處有以下幾點:

首先發資源文件,由於文件名已經不一樣了,所以不會覆蓋掉之前存在的資源文件,客戶端依舊可以安全的訪問。     

再發客戶端文件,在客戶端文件一旦發布成功,那麼就會立馬切成新的特性,中間可以做到無縫銜接。 這就是所謂的非覆蓋發布的方案。

 

(十)、基礎組件庫的建設

        梳理門戶常見的組件,並形成統一的UI組件庫,從而更加優化的交互,以及方便後面升級。

門戶常用的組件不多,但是需要梳理出規範,這樣便於第三方接入。

優點:

1、 方便頁面展示好看,並且方便第三方接入。

(十一)、瀏覽器兼容

兼容性考慮統一解決方案,避免bug的重複產生。

常見解決方案:

配置postcss,讓某些css增加兼容性前綴;

寫一個wepback的loader,處理某些特殊場景;

規範團隊代碼,使用更穩定的寫法(例如移動端避免使用fixed進行布局);

對常見問題、疑難問題,總結解決方案並團隊共享;

建議或引導用戶使用高版本瀏覽器(比如chrome);

優點:

1、避免瀏覽器環境產生的bug,以及排查此類bug所浪費的大量時間。

 

(十二)、考慮響應式設計

盡量支持響應式布局,方便在移動設備上显示。

優點:

1、為後期多端開發提供支撐。

 

(十三)、採用靜態資源部署方式

    為了前端靜態資源方便維護和升級,建議分開部署,和服務端tomcat容器不要部署在一起。

利用nginx分向,使用之前對接完成的地址+新增一個獨立上下文,然後nginx攔截執行到tomcat外層靜態文件,原請求上下文依然使用nginx指向到tomcat調用接口。

優點:

1、 提升靜態資源響應速度。

 

四、非功能性需求

(一)、安全管理

安全管理的很難從架構設計上完全避免,但還是有一定解決方案的,常見安全問題如下:

XSS注入:對用戶輸入的內容,需要轉碼(大部分時候要server端來處理,偶爾也需要前端處理),禁止使用eval函數;

https:這個顯然是必須的,好處非常多;

CSRF:要求server端加入CSRF的處理方法(至少在關鍵頁面加入);

優點:

1、減少安全漏洞,避免用戶受到損失,避免遭遇惡意攻擊,增加系統的穩定性和安全性。

 

(二)、埋點系統

強烈推薦前端做自己的埋點系統。這個不同於後端的日誌系統。

前端埋點系統的好處:

記錄每個頁面的訪問量(日周月年的UV、PV);

記錄每個功能的使用量;

捕捉報錯情況;

圖表化显示,方便給其他部門展示;

埋點系統是前端高度介入業務,把握業務發展情況的一把利劍,通過這個系統,我們可以比後端更深刻的把握用戶的習慣,以及給產品經理、運營等人員提供準確的數據依據。當有了數據后,前端人員就可以針對性的優化功能、布局、   頁面交互邏輯、用戶使用流程。

埋點系統應和業務解耦,開發人員使用時註冊,然後在項目中引入。然後在埋點系統里查看相關數據(例如以小時、日、周、月、年為周期查看)

優點:

1、數據是money,數據是公司的生命線,數據是最好的武器。

 

以上一些點是我們在門戶開發中常注意的點,來解決交互,性能和安全方面的問題。

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※好月嫂難尋!台北到府坐月子新北市到府坐月子專業月嫂真心推薦

桃園婚紗店推薦,最優惠方案一覽表

桃園機場租車可以要求甲租乙還服務?

※台東吃喝懶人包!台東名產推薦台東名產伴手禮都在這裡”報吼你災”

※專業婚禮錄影團隊,用鏡頭記錄人生中值得紀念的一刻!

※想知道台中一中民宿最佳地點在哪? 近一中街民宿,各大夜市、商圈活動行程便利,最新住宿攻略!

java架構之路(MQ專題)kafka集群配置和簡單使用

前面我們說了RabbitMQ和RocketMQ的安裝和簡單的使用,這次我們說一下Kafka的安裝配置,後面我會用幾個真實案例來說一下MQ的真實使用場景。天冷了,不願意伸手,最近沒怎麼寫博客了,還請見諒。

一、目標

1.知道什麼是Kafka

2.懂得kafka的單機和集群安裝配置

3.了解內部參數的簡單配置

二、Kafka簡介

 

  Kafka是由Apache軟件基金會開發的一個開源流處理平台,由Scala和Java編寫。Kafka是一種高吞吐量的分佈式發布訂閱消息系統,它可以處理消費者在網站中的所有動作流數據。 這種動作(網頁瀏覽,搜索和其他用戶的行動)是在現代網絡上的許多社會功能的一個關鍵因素。 這些數據通常是由於吞吐量的要求而通過處理日誌和日誌聚合來解決。 對於像Hadoop一樣的日誌數據和離線分析系統,但又要求實時處理的限制,這是一個可行的解決方案。Kafka的目的是通過Hadoop的并行加載機制來統一線上和離線的消息處理,也是為了通過集群來提供實時的消息。——百度百科

三、Kafka使用場景

  • 日誌收集:一個公司可以用Kafka可以收集各種服務的log,通過kafka以統一接口服務的方式開放給各種consumer,例如hadoop、Hbase、Solr等。
  • 消息系統:解耦和生產者和消費者、緩存消息等。
  • 用戶活動跟蹤:Kafka經常被用來記錄web用戶或者app用戶的各種活動,如瀏覽網頁、搜索、點擊等活動,這些活動信息被各個服務器發布到kafka的topic中,然後訂閱者通過訂閱這些topic來做實時的監控分析,或者裝載到hadoop、數據倉庫中做離線分析和挖掘。
  • 運營指標:Kafka也經常用來記錄運營監控數據。包括收集各種分佈式應用的數據,生產各種操作的集中反饋,比如報警和報告。

四、相關術語

  • Broker

Kafka集群包含一個或多個服務器,這種服務器被稱為broker

  • Topic

每條發布到Kafka集群的消息都有一個類別,這個類別被稱為Topic。

  • Partition

Partition是物理上的概念,每個Topic包含一個或多個Partition.

  • Producer

負責發布消息到Kafka broker

  • Consumer

消息消費者,向Kafka broker讀取消息的客戶端。

  • Consumer Group

每個Consumer屬於一個特定的Consumer Group(可為每個Consumer指定group name,若不指定group name則屬於默認的group)。

五、單機安裝

  1.安裝jdk,輸入yum install -y java-1.8.0-openjdk* 耐心等待即可,安裝完成以後,輸入$ java -version,檢查是否安裝成功。

  2.由於Kafka是基於Zookeeper環境的,我們安裝一下Zookeeper(不安裝也可以,最好配置一下,便於後期理解,建議安裝3.*版本)。我以前寫過Zookeeper的安裝過程,想看的可以去了解一下

  3.輸入wget https://archive.apache.org/dist/kafka/1.1.0/kafka_2.11-1.1.0.tgz 等待下載完成,Kafka現在是0.*,1.*,2.*三個版本,這裏建議使用1.*版本,你也可以下載最新的2.3.1版本,下載方式wget https://mirrors.tuna.tsinghua.edu.cn/apache/kafka/2.3.1/kafka_2.12-2.3.1.tgz,這裏說一下,kafka_2.12-2.3.1.tgz前面的2.12是Scala語言版本,後面的2.3.1才是我們的Kafka的版本。官網地址:

4.解壓tar -zxvf kafka_2.11-1.1.0.tgz

5.進入到config目錄下,vim server.properties,我們在123行可以看到Zookeeper的配置如下(不是localhost的自己改一下)

 

6.啟動$ ./bin/kafka-server-start.sh -daemon config/server.properties

7.進入Zookeeper下查看節點信息。

輸入jps看到我們的進程kafka,單機配置成功。

六、集群安裝

  1.重複單機安裝步驟。

  2.修改配置文件,在21行broker.id設置為不同的数字,第一台可以設置0,第二台1,依次類推,在123行 zookeeper.connect寫入Zookeeper集群連接,例如zookeeper.connect=47.105.137.93:2181,114.215.145.41:2181,115.29.151.4:2181。

3.分別啟動三個Kafka。

4.測試集群,創建一個主題./bin/kafka-topics.sh –create –zookeeper  47.105.137.93:2181,114.215.145.41:2181,115.29.151.4:2181  –replication-factor 1 –partitions 1 –topic test

到其它服務器下查看現有主題即可。

七、簡單使用

  1.創建主題 ./bin/kafka-topics.sh –create –zookeeper IP:端口,IP:端口 –replication-factor 副本數 –partitions 分區數 –topic 主題名

   例如:./bin/kafka-topics.sh –create –zookeeper 47.105.137.93:2181,114.215.145.41:2181,115.29.151.4:2181 –replication-factor 1 –partitions 1 –topic xiaocaijishu

  2.查看現有主題 ./bin/kafka-topics.sh –list –zookeeper IP:端口,IP:端口

   例如:./bin/kafka-topics.sh –list –zookeeper 47.105.137.93:2181,114.215.145.41:2181,115.29.151.4:2181

  3.刪除主題 ./bin/kafka-topics.sh –delete –topic xiaocaijishu2 –zookeeper IP:端口,IP:端口

  例如:./bin/kafka-topics.sh –delete –topic xiaocaijishu2 –zookeeper 47.105.137.93:2181,114.215.145.41:2181,115.29.151.4:2181  

   4.發送消息 ./bin/kafka-console-producer.sh –broker-list Kafka服務器IP:9092 –topic 主題名

  例如:./bin/kafka-console-producer.sh –broker-list 47.105.137.93:9092 –topic xiaocaijishu

  5.消費消息./bin/kafka-console-consumer.sh –bootstrap-server Kafka服務器IP:9092 –consumer-property group.id=消費組名稱 –topic 主題名

  例如: ./bin/kafka-console-consumer.sh –bootstrap-server 47.105.137.93:9092 –consumer-property group.id=xiaocaiGroup –topic xiaocaijishu

  6.查看現有消費組 ./bin/kafka-consumer-groups.sh –bootstrap-server Kafka服務器IP:9092 –list

   例如:./bin/kafka-consumer-groups.sh –bootstrap-server 47.105.137.93:9092 –list

 

 

最進弄了一個公眾號,小菜技術,歡迎大家的加入

 

 

 

 

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※想知道大胸女孩都會買什麼款式的內衣呢?d cup內衣,e cup內衣挑選完美致勝推薦

※濃郁的奶香牛軋糖-最好吃的伴手禮,送禮要送進心崁裡!

※專為各大企業長短期商務包車接送的服務

※來台東旅遊不可錯過的,台東必買名產 「池上米、地瓜酥、洛神花」都在”購夠台東“網路商城皆買的到哦!

※2020推薦婚禮錄影台北精選18家專業團隊

※票選台中最佳親子活動.情侶約會必住的一中街住宿,旅遊行程推薦!

※找尋專業廣告設計,價格公道大圖輸出,背板品質佳

《Java多線程面試題》系列-創建線程的三種方法及其區別

1. 創建線程的三種方法及其區別

1.1 繼承Thread類

首先,定義Thread類的子類並重寫run()方法:

package com.zwwhnly.springbootaction.javabase.thread;

public class MyFirstThread extends Thread {
    @Override
    public void run() {
        for (int i = 0; i < 5; i++) {
            System.out.printf("[MyFirstThread]輸出:%d,當前線程名稱:%s\n",
                    i, getName());
        }
    }
}

然後,創建該子類的實例並調用start()方法啟動線程:

package com.zwwhnly.springbootaction.javabase.thread;

public class ThreadTest {
    public static void main(String[] args) {
        System.out.println("主線程開始執行,當前線程名稱:" +
                Thread.currentThread().getName());

        Thread firstThread = new MyFirstThread();
        firstThread.start();

        System.out.println("主線程執行結束,當前線程名稱:" +
                Thread.currentThread().getName());
    }
}

運行結果如下所示:

主線程開始執行,當前線程名稱:main

主線程執行結束,當前線程名稱:main

[MyFirstThread]輸出:0,當前線程名稱:Thread-0

[MyFirstThread]輸出:1,當前線程名稱:Thread-0

[MyFirstThread]輸出:2,當前線程名稱:Thread-0

[MyFirstThread]輸出:3,當前線程名稱:Thread-0

[MyFirstThread]輸出:4,當前線程名稱:Thread-0

從運行結果可以看出以下2個問題:

  1. 程序中存在2個線程,分別為主線程main和自定義的線程Thread-0。
  2. 調用firstThread.start();,run()方法體中的代碼並沒有立即執行,而是異步執行的。

查看Thread類的源碼,可以發現Thread類實現了接口Runnable:

public class Thread implements Runnable {
    // 省略其它代碼
}

這裡是重點,面試常問!

1.2 實現Runnable接口(推薦)

首先,定義Runnable接口的實現類並實現run()方法:

package com.zwwhnly.springbootaction.javabase.thread;

public class MySecondThread implements Runnable {
    @Override
    public void run() {
        for (int i = 0; i < 5; i++) {
            System.out.printf("[MySecondThread]輸出:%d,當前線程名稱:%s\n",
                    i, Thread.currentThread().getName());
        }
    }
}

然後,調用Thread類的構造函數創建Thread實例並調用start()方法啟動線程:

package com.zwwhnly.springbootaction.javabase.thread;

public class ThreadTest {
    public static void main(String[] args) {
        Runnable target = new MySecondThread();
        Thread secondThread = new Thread(target);
        secondThread.start();
    }
}

運行結果如下所示:

主線程開始執行,當前線程名稱:main

主線程執行結束,當前線程名稱:main

[MySecondThread]輸出:0,當前線程名稱:Thread-0

[MySecondThread]輸出:1,當前線程名稱:Thread-0

[MySecondThread]輸出:2,當前線程名稱:Thread-0

[MySecondThread]輸出:3,當前線程名稱:Thread-0

[MySecondThread]輸出:4,當前線程名稱:Thread-0

可以看出,使用這種方式和繼承Thread類的運行結果是一樣的。

1.3 實現Callable接口

首先,定義Callable接口的實現類並實現call()方法:

package com.zwwhnly.springbootaction.javabase.thread;

import java.util.Random;
import java.util.concurrent.Callable;

public class MyThirdThread implements Callable<Integer> {
    @Override
    public Integer call() throws Exception {
        Thread.sleep(6 * 1000);
        return new Random().nextInt();
    }
}

然後,調用FutureTask類的構造函數創建FutureTask實例:

Callable<Integer> callable = new MyThirdThread();
FutureTask<Integer> futureTask = new FutureTask<>(callable);

最後,調用Thread類的構造函數創建Thread實例並調用start()方法啟動線程:

package com.zwwhnly.springbootaction.javabase.thread;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

public class ThreadTest {
    public static void main(String[] args) {
        System.out.println("主線程開始執行,當前線程名稱:" +
                Thread.currentThread().getName());

        Callable<Integer> callable = new MyThirdThread();
        FutureTask<Integer> futureTask = new FutureTask<>(callable);
        new Thread(futureTask).start();

        try {
            System.out.println("futureTask.isDone() return:" + futureTask.isDone());

            System.out.println(futureTask.get());

            System.out.println("futureTask.isDone() return:" + futureTask.isDone());
        } catch (InterruptedException | ExecutionException e) {
            e.printStackTrace();
        }

        System.out.println("主線程執行結束,當前線程名稱:" +
                Thread.currentThread().getName());
    }
}

運行結果如下所示:

主線程開始執行,當前線程名稱:main

futureTask.isDone() return:false

-1193053528

futureTask.isDone() return:true

主線程執行結束,當前線程名稱:main

可以發現,使用Callable接口這種方式,我們可以通過futureTask.get()獲取到線程的執行結果,而之前的2種方式,都是沒有返回值的。

注意事項:調用futureTask.get()獲取線程的執行結果時,主線程會阻塞直到獲取到結果。

阻塞效果如下圖所示:

1.4 區別

以下是重點,面試常問!

  1. Java中,類僅支持單繼承,如果一個類繼承了Thread類,就無法再繼承其它類,因此,如果一個類既要繼承其它的類,又必須創建為一個線程,就可以使用實現Runable接口的方式。
  2. 使用實現Runable接口的方式創建的線程可以處理同一資源,實現資源的共享。
  3. 使用實現Callable接口的方式創建的線程,可以獲取到線程執行的返回值、是否執行完成等信息。

關於第2點,可以通過如下示例來理解。

假如我們總共有10張票(共享的資源),為了提升售票的效率,開了3個線程來售賣,代碼如下所示:

package com.zwwhnly.springbootaction.javabase.thread;

public class SaleTicketThread implements Runnable {
    private int quantity = 10;

    @Override
    public void run() {
        while (quantity > 0) {
            System.out.println(quantity-- + " is saled by " +
                    Thread.currentThread().getName());
        }
    }
}
public static void main(String[] args) {
    Runnable runnable = new SaleTicketThread();
    Thread saleTicketThread1 = new Thread(runnable);
    Thread saleTicketThread2 = new Thread(runnable);
    Thread saleTicketThread3 = new Thread(runnable);

    saleTicketThread1.start();
    saleTicketThread2.start();
    saleTicketThread3.start();
}

因為3個線程都是異步執行的,因此每次的運行結果可能是不一樣,以下列舉2次不同的運行結果。

第1次運行結果:

10 is saled by Thread-0

8 is saled by Thread-0

7 is saled by Thread-0

5 is saled by Thread-0

9 is saled by Thread-1

3 is saled by Thread-1

2 is saled by Thread-1

1 is saled by Thread-1

4 is saled by Thread-0

6 is saled by Thread-2

第2次運行結果:

10 is saled by Thread-0

9 is saled by Thread-0

8 is saled by Thread-0

7 is saled by Thread-0

6 is saled by Thread-0

5 is saled by Thread-0

3 is saled by Thread-0

2 is saled by Thread-0

4 is saled by Thread-2

1 is saled by Thread-1

如果將上面的SaleTicketThread修改成繼承Thread類的方式,就變成了3個線程各自擁有10張票,即變成了30張票,而不是3個線程共享10張票。

2. Thread類start()和run()的區別

2.1 示例

因為實現Runnable接口的優勢,基本上實現多線程都使用的是該種方式,所以我們將之前定義的MyFirstThread也修改為實現Runnable接口的方式:

package com.zwwhnly.springbootaction.javabase.thread;

public class MyFirstThread implements Runnable {
    @Override
    public void run() {
        for (int i = 0; i < 5; i++) {
            System.out.printf("[MyFirstThread]輸出:%d,當前線程名稱:%s\n",
                    i, Thread.currentThread().getName());
        }
    }
}

然後仍然沿用之前定義的MyFirstThread、MySecondThread,我們先看下調用start()的效果:

package com.zwwhnly.springbootaction.javabase.thread;

public class ThreadTest {
    public static void main(String[] args) {

        System.out.println("主線程開始執行,當前線程名稱:" +
                Thread.currentThread().getName());

        Thread firstThread = new Thread(new MyFirstThread());

        Runnable target = new MySecondThread();
        Thread secondThread = new Thread(target);

        firstThread.start();
        secondThread.start();

        System.out.println("主線程執行結束,當前線程名稱:" +
                Thread.currentThread().getName());
    }
}

運行結果(注意:多次運行,結果可能不一樣):

主線程開始執行,當前線程名稱:main

[MyFirstThread]輸出:0,當前線程名稱:Thread-0

[MyFirstThread]輸出:1,當前線程名稱:Thread-0

[MySecondThread]輸出:0,當前線程名稱:Thread-1

主線程執行結束,當前線程名稱:main

[MySecondThread]輸出:1,當前線程名稱:Thread-1

[MySecondThread]輸出:2,當前線程名稱:Thread-1

[MySecondThread]輸出:3,當前線程名稱:Thread-1

[MySecondThread]輸出:4,當前線程名稱:Thread-1

[MyFirstThread]輸出:2,當前線程名稱:Thread-0

[MyFirstThread]輸出:3,當前線程名稱:Thread-0

[MyFirstThread]輸出:4,當前線程名稱:Thread-0

可以看出,調用start()方法后,程序中有3個線程,分別為主線程main、Thread-0、Thread-1,而且執行順序不是按順序執行的,存在不確定性。

然後將start()方法修改為run()方法,如下所示:

firstThread.run();
secondThread.run();

此時的運行結果如下所示(多次運行,結果是一樣的):

主線程開始執行,當前線程名稱:main

[MyFirstThread]輸出:0,當前線程名稱:main

[MyFirstThread]輸出:1,當前線程名稱:main

[MyFirstThread]輸出:2,當前線程名稱:main

[MyFirstThread]輸出:3,當前線程名稱:main

[MyFirstThread]輸出:4,當前線程名稱:main

[MySecondThread]輸出:0,當前線程名稱:main

[MySecondThread]輸出:1,當前線程名稱:main

[MySecondThread]輸出:2,當前線程名稱:main

[MySecondThread]輸出:3,當前線程名稱:main

[MySecondThread]輸出:4,當前線程名稱:main

主線程執行結束,當前線程名稱:main

可以看出,調用run()方法后,程序中只有一個主線程,自定義的2個線程並沒有啟動,而且執行順序也是按順序執行的。

1.2 總結

以下是重點,面試常問!

  • run()方法只是一個普通方法,調用之後程序會等待run()方法執行完畢,所以是串行執行,而不是并行執行。
  • start()方法會啟動一個線程,當線程得到CPU資源後會自動執行run()方法體中的內容,實現真正的併發執行。

3. Runnable和Callable的區別

在文章前面的章節中(1.2 實現Runnable接口 和1.3 實現Callable接口),我們了解了如何使用Runnable、Callable接口來創建線程,現在我們分別看下Runable和Callable接口的定義,其中,Runable接口的定義如下所示:

public interface Runnable {
    public abstract void run();
}

Callable接口的定義如下所示:

public interface Callable<V> {
    V call() throws Exception;
}

由此可以看出,Runnable和Callable的區別主要有以下幾點:

  1. Runable的執行方法是run(),Callable的執行方法是call()
  2. call()方法可以拋出異常,run()方法如果有異常只能在內部消化
  3. 實現Runnable接口的線程沒有返回值,實現Callable接口的線程能返回執行結果
  4. 實現Callable接口的線程,可以和FutureTask一起使用,獲取到線程是否完成、線程是否取消、線程執行結果,也可以取消線程的執行。

4. 源碼及參考

源碼地址:,歡迎下載。

如果覺得文章寫的不錯,歡迎關注我的微信公眾號:「申城異鄉人」,所有博客會同步更新。

如果有興趣,也可以添加我的微信:zwwhnly_002,一起交流和探討技術。

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※廣受好評的【機場接送推薦

租車接送服務需要另外加價嗎?

台東人氣名產台東人氣伴手禮,熱門獨家商品,現貨供應中

※坐月子經驗談-新竹到府坐月子媽媽心得分享與交流

※給婚攝的迎娶婚禮錄影必拍清單,沒拍到您一定會後悔!

※旅遊不求人,帶你掌握小琉球民宿海景攻略

※各類招牌、海報、大圖輸出,急件製作施工!