java main方法在堆區(qū)還是棧區(qū) 如何理解應(yīng)用Java多線程與并發(fā)編程?
如何理解應(yīng)用Java多線程與并發(fā)編程?多線程:在了解線程之前,要先知道進(jìn)程這個(gè)概念。進(jìn)程是另一個(gè)本身的的功能的程序關(guān)與某個(gè)數(shù)據(jù)子集的兩次運(yùn)行活動(dòng)。簡(jiǎn)單點(diǎn)說(shuō),進(jìn)程是執(zhí)行中的程序活動(dòng),是一個(gè)活動(dòng)的實(shí)體。多
如何理解應(yīng)用Java多線程與并發(fā)編程?
多線程:在了解線程之前,要先知道進(jìn)程這個(gè)概念。進(jìn)程是另一個(gè)本身的的功能的程序關(guān)與某個(gè)數(shù)據(jù)子集的兩次運(yùn)行活動(dòng)。簡(jiǎn)單點(diǎn)說(shuō),進(jìn)程是執(zhí)行中的程序活動(dòng),是一個(gè)活動(dòng)的實(shí)體。多進(jìn)程,就形同同樣的打開了Word,Excel和Visio,他們也是相同的程序運(yùn)行活動(dòng),即多個(gè)進(jìn)程同樣的啟動(dòng)而己,這個(gè)概念比較好好理解。線程,是一個(gè)想執(zhí)行中的程序活動(dòng)(即進(jìn)程)的多個(gè)先執(zhí)行路徑,先執(zhí)行指揮調(diào)度的單位。線程依托于進(jìn)程必然,在進(jìn)程之下,這個(gè)可以互相訪問(wèn)進(jìn)程的內(nèi)存,不過(guò)還具備一個(gè)不屬于自己的內(nèi)存空間,這段內(nèi)存空間也叫暗線程棧,是在建立起線程時(shí)由系統(tǒng)分配的,主要用來(lái)存放線程內(nèi)部所建議使用的數(shù)據(jù)。多線程,指在一個(gè)進(jìn)程下有多個(gè)線程。各個(gè)線程想執(zhí)行自己的任務(wù),這些線程可以”同時(shí)參與“(這里加了雙引號(hào),下面會(huì)講了到加雙引號(hào)的原因)。那多進(jìn)程有什么好處?多線程應(yīng)用在生活中經(jīng)常可見(jiàn),Word文檔那就是另一個(gè)很不錯(cuò)的例子。Word有“后臺(tái)可以打印”的功能,用戶點(diǎn)擊打印出來(lái)按鈕后,如果沒(méi)有發(fā)現(xiàn)自己可以對(duì)當(dāng)前文本并且改,也可以在打印過(guò)程中來(lái)到主界面參與修改、能保存等操作。假如沒(méi)有應(yīng)用多線程,不如你題中用戶要打印出來(lái)的文本很長(zhǎng)很長(zhǎng),那么用戶要等打印出來(lái)操作想執(zhí)行完后,才也可以對(duì)文本通過(guò)直接修改編輯的話存放等,這樣用戶體驗(yàn)就不如我多線程的好。還有一個(gè)迅雷,有沒(méi)才發(fā)現(xiàn)迅雷是也可以而上網(wǎng)下載東西的?或者同樣去下載A,B,A上網(wǎng)下載進(jìn)度到53.4%,B上網(wǎng)下載進(jìn)度到47.1%,偶爾會(huì)A速度快些,老是B速度快些,其實(shí)能確認(rèn)的是A,B都在下載內(nèi)容,而也不是必須得等A上網(wǎng)下載完后,B才這個(gè)可以開始上網(wǎng)下載,這都是多線程的作用。所以,多線程指出”而,互相參與“,而也不是同一類的順下不能操作。
并發(fā):Concurrency,是并發(fā)的意思。并發(fā)的實(shí)質(zhì)是一個(gè)物理CPU(也是可以多個(gè)物理CPU)在若干道程序(或線程)之間多路復(fù)用,并發(fā)性是對(duì)不足物理資源噬靈鬼斬法律賦予多用戶共享以想提高效率。微觀角度:所有的并發(fā)一次性處理都有排隊(duì)等候,沉睡,不能執(zhí)行等這樣的步驟,在微觀上他們也是序列被去處理的,要是是同一時(shí)刻至的請(qǐng)求(或線程)也會(huì)依據(jù)優(yōu)先級(jí)的不同,而先后直接進(jìn)入隊(duì)列排隊(duì)等候不能執(zhí)行。宏觀角度:多個(gè)甚至同時(shí)可到達(dá)的請(qǐng)求(或線程)在宏觀上看看上去像是同時(shí)在被如何處理。通俗點(diǎn)點(diǎn)講,并發(fā)應(yīng)該是只有一一個(gè)CPU資源,程序(或線程)之間要競(jìng)爭(zhēng)我得到負(fù)責(zé)執(zhí)行機(jī)會(huì)。圖中的第一個(gè)階段,在A想執(zhí)行的過(guò)程中B,C絕對(duì)不會(huì)先執(zhí)行,畢竟這段時(shí)間內(nèi)這個(gè)CPU資源被A競(jìng)爭(zhēng)到了,同理可知,第二個(gè)階段只能B在想執(zhí)行,第三個(gè)階段唯有C在負(fù)責(zé)執(zhí)行??傊?,并發(fā)過(guò)程中,A,B,C并不是什么同樣的在并且的(微觀角度)。但又是同樣的進(jìn)行的(宏觀微觀角度)。
并行:Parallelism,即聯(lián)成一體,指兩個(gè)或兩個(gè)以上事件(或線程)在同一時(shí)刻再一次發(fā)生,是真正的意義上的差別事件或線程在同一時(shí)刻,在相同CPU資源呢上(多核),同樣的想執(zhí)行。右行,不未知像并發(fā)那樣競(jìng)爭(zhēng)很激烈,靜靜的等待的概念。圖中,A,B,C都在同時(shí)不運(yùn)行(微觀,微觀)。
按照多線程利用并發(fā),并行:java中的Thread類定義了多線程,實(shí)際多線程也可以實(shí)現(xiàn)方法并發(fā)或并行。在CPU比較繁忙,資源下降的時(shí)候(再開啟了很多進(jìn)程),操作系統(tǒng)只為一個(gè)含有多線程的進(jìn)程分區(qū)分配只剩下的CPU資源,這些線程都會(huì)為自己注意多搶時(shí)間片,這就是是從多線程利用并發(fā),線程之間會(huì)競(jìng)爭(zhēng)CPU資源爭(zhēng)取負(fù)責(zé)執(zhí)行機(jī)會(huì)。在CPU資源比較足夠的時(shí)候,一個(gè)進(jìn)程內(nèi)的多線程,是可以被未分配到完全不同的CPU資源,這那是通過(guò)多線程利用并行。不過(guò)多線程利用的是并發(fā)應(yīng)該并行?上面所說(shuō),所寫多線程很可能被分配到一個(gè)CPU內(nèi)核中執(zhí)行,也很有可能被未分配到有所不同CPU執(zhí)行,怎么分配過(guò)程是操作系統(tǒng)所為,絕不可以人為操縱。所有,假如有人問(wèn)我我所寫的多線程是并發(fā)應(yīng)該并行的?我會(huì)說(shuō),都是很可能。不論并發(fā)應(yīng)該分頭并進(jìn),都提高了程序?qū)PU資源的利用率,最大程度地用來(lái)CPU資源。
怎樣學(xué)習(xí)Java?
爭(zhēng)取很不重要,方法同樣不重要!
Java學(xué)習(xí)的十條建議:一、從零基礎(chǔ)自學(xué)Java,只要你方確的,仍然可以把英語(yǔ)學(xué)好Java編程
學(xué)習(xí)Java得象交朋友完全不一樣,要從陌生到熟悉再到交情深厚搭檔一生相隨的過(guò)程,隨著進(jìn)入到的了解,你而且會(huì)發(fā)現(xiàn)自己學(xué)Java并不是和想像的這樣無(wú)聊啊和困難,不過(guò)還有一些美妙之感;肯定在占據(jù)極為強(qiáng)大的技術(shù)和出色的設(shè)計(jì)思想后才能感覺(jué)道的。
二、多殺他,多實(shí)踐,多敲代碼
實(shí)踐是分析檢驗(yàn)理論的任何標(biāo)準(zhǔn),只有代碼敲的多了才能讓你切身體會(huì)到代碼中的美麗,才能不斷地發(fā)現(xiàn)到編程語(yǔ)言的優(yōu)缺點(diǎn)和能解決問(wèn)題的方案。對(duì)初學(xué)者來(lái)說(shuō)實(shí)力提升代碼質(zhì)量的任何途徑那是多敲代碼,就算是是一個(gè)更加簡(jiǎn)單問(wèn)題,也要將它用代碼實(shí)現(xiàn)程序并運(yùn)行,這才是去學(xué)習(xí)編程的正確之路。靠眼睛看是學(xué)不會(huì)編程序的,只有用手練才能讓你更好的學(xué)習(xí)編程。
三、學(xué)會(huì)了記筆記,把自己的想法和靈感記下
好記性不如爛筆頭,當(dāng)我們?cè)趯W(xué)習(xí)中你可能會(huì)靈機(jī)一閃,有了一個(gè)尤其好的想法和靈感,或者突然之間想同了一個(gè)總是困惱自己的問(wèn)題,用筆記錄下了,如果不是想會(huì)用到的話,也可以隨時(shí)去翻閱,那就是你的成長(zhǎng)日記。而,也要一個(gè)極度熱愛(ài)能分享的人,把你的經(jīng)驗(yàn)和想法拿來(lái)能分享到你的論壇和博客,解決那些要幫助的人,資源共享是推動(dòng)技術(shù)的比較多力量。
四、學(xué)會(huì)和則是怎么學(xué)習(xí)編程的人多聯(lián)系
學(xué)java又不是一個(gè)人在戰(zhàn)斗,有很多人他們和你一樣,在同一個(gè)起跑線上努力奮斗著。能在用框架基于一個(gè)簡(jiǎn)單的程序又不是能夠的挑戰(zhàn),當(dāng)你真正下一界一個(gè)軟件開發(fā)工程師的時(shí)候,你就能發(fā)現(xiàn)很多比較奇葩的問(wèn)題,自己一個(gè)人很有可能能解決不了,你必須依靠一些人給你提供可以解決的思路,就算是是只字片語(yǔ)都有肯定幫你渡過(guò)難關(guān)。才是一名初學(xué)者,千萬(wàn)不能饒過(guò)一個(gè)可能會(huì)讓你提升的機(jī)會(huì),尋找風(fēng)一些好的交流平臺(tái),不會(huì)的問(wèn)題,問(wèn)題能解決一個(gè)少一個(gè),自己也會(huì)在不斷進(jìn)步。同樣的你也要能學(xué)會(huì)彼此分享,把自己的經(jīng)驗(yàn)和想法分享給和到有需要的人,不單也可以解決他們的,不過(guò)也培養(yǎng)了自己的知識(shí);知道怎么樣多多分享都是一種美德。
五、虛心學(xué)習(xí),接受快速有效的指導(dǎo)
在自學(xué)編程的道路上別人傳授經(jīng)驗(yàn)有著至關(guān)重要的作用,管用的指導(dǎo)這個(gè)可以讓你免走彎路,自我提升的越快。最優(yōu)秀的開發(fā)工程師為啥待遇高但在項(xiàng)目中有著舉足輕重的作用,主要注意是而且他們不僅也能把握項(xiàng)目開發(fā)的對(duì)的方向,但是還能夠帶領(lǐng)團(tuán)隊(duì)其它成員進(jìn)階自己的開發(fā)水平,這是任何一個(gè)企業(yè)都悲憫的確實(shí)是初入茅廬的Java人員所一種渴望的。這些經(jīng)驗(yàn)的積累不可能都來(lái)自教科書,而積累人脈又是十分有利的,人脈的積累不但也可以轉(zhuǎn)化成為經(jīng)驗(yàn)的積累還可能會(huì)能量轉(zhuǎn)化為財(cái)富的積累。
六、掌握核心的API
初學(xué)java,不要好高騖遠(yuǎn),盯著覺(jué)得會(huì)容易可是做著難,能再理解非常容易,做就不是有會(huì)做;在學(xué)的過(guò)程中理論知識(shí)掌握不光要非常熟練并且要解釋,假如不了解語(yǔ)言構(gòu)成核心API那一切全是0!是對(duì)Java語(yǔ)言而言,你要對(duì)它的API有太強(qiáng)的實(shí)戰(zhàn)經(jīng)驗(yàn),例如*,IO,Exception(極其),Collections(真包含于),Generics(泛型),Threads(線程),JDBC(數(shù)據(jù)庫(kù)連接上)等等。假如你打算曾經(jīng)的一個(gè)出色的程序開發(fā)者,不管你用什么類型的框架,你都需要要比較熟悉Servlet和JSP。
七、經(jīng)常會(huì)尋找風(fēng)技術(shù)博客,學(xué)習(xí)泛讀
論壇里有很多技術(shù)牛人都實(shí)際博客來(lái)彼此分享自己的技術(shù)經(jīng)驗(yàn)和編程心得,你只是需要勤奮刻苦一些去發(fā)現(xiàn)到并找到自己需要的博客,每隔一天去泛讀他們的技術(shù)文章,可以不所了解到有所不同人對(duì)同一技術(shù)的經(jīng)驗(yàn)和看法,可能他們會(huì)為某一項(xiàng)功能而爭(zhēng)執(zhí)不絕,你不是需要去去管,可以不在“諸人”的時(shí)候要去分析各種觀點(diǎn),逐漸地不能形成自己的思想,時(shí)間一久你會(huì)的確感覺(jué)到自己在程序設(shè)計(jì)上的提升。
八、偶爾會(huì)怎么學(xué)習(xí)和閱讀開源框架源碼
成績(jī)合格的開發(fā)者夫欲能靈巧的使用各種框架,而要想成為一個(gè)出色的開發(fā)者,就肯定要不斷的去學(xué)流行框架的源碼,不停的泛讀,這樣才也能接觸了解框架內(nèi)部機(jī)制,但又要大量的練習(xí),這樣才能逐漸地十分豐富自己的代碼設(shè)計(jì)思想,藍(lán)月帝國(guó)做一個(gè)代碼的創(chuàng)造者而也不是代碼的復(fù)制者。
九、有用代碼和工具會(huì)給我們給予大跌眼睛的驚喜
當(dāng)今,軟件的日漸興盛流行和Java的豐富的資源,一生注定一些代碼要重復(fù)使用,隨著你的工作經(jīng)驗(yàn)的積累,這樣的簡(jiǎn)單重復(fù)性工作可能更多,所以你要要會(huì)整理好并收集一些常用代碼,在諸如:log4j的配置文件(),JDBC配置,框架的配置等,還有一個(gè)工具類的或者StringUtils(字符串工具),DBUtils(數(shù)據(jù)庫(kù)工具)等等,這會(huì)對(duì)給你以后的工作受到極大的便利,有時(shí)候走一個(gè)捷徑可以讓你可以省掉不少麻煩。
十、了解未來(lái)技術(shù)的發(fā)展方向
兩耳不聞窗外事,一心可讀寫圣賢書,在如今的互聯(lián)網(wǎng)時(shí)代是不合適的,才是一個(gè)軟件開發(fā)者,假如技術(shù)速度不夠可以不去苦練,不過(guò)如果思想要速度不夠,你拼死拼活剛做出來(lái)的產(chǎn)品最大的可能已經(jīng)落后挨打了,很可能只不過(guò)是一個(gè)不值一提的小功能,如果沒(méi)有思想速度不夠,那就就肯定不能能夠掌握拒絕,也有肯定會(huì)被產(chǎn)品經(jīng)理抱怨技術(shù)落后什么功能都實(shí)現(xiàn)程序不了,因此我們?cè)诘拖骂^來(lái)看代碼的同時(shí)也要打開雙耳,知道一點(diǎn)未來(lái)技術(shù)的發(fā)展方向,那樣的話才能盡量再度領(lǐng)先,才能凝立未敗。
不過(guò),Java是一門容易上手的編程語(yǔ)言,可是要想想學(xué)好,努力是必不可缺的。學(xué)習(xí)java也要自己有十分充分的信心,不斷的調(diào)整學(xué)習(xí)方法和態(tài)度,如果你初入學(xué)習(xí)Java遇到問(wèn)題沒(méi)有人解答也這個(gè)可以來(lái)找源妹兒幫忙解決。