第一篇:java軟件編程培訓(xùn)
最好的Java軟件編程培訓(xùn)
西安雁塔尚學(xué)堂計算機(jī)學(xué)校創(chuàng)辦于2009年,是陜西省培養(yǎng)計算機(jī)實(shí)用性人才的學(xué)校,學(xué)校以“程序運(yùn)行人生,快樂魔力學(xué)堂”的口號名揚(yáng)陜西,并且開創(chuàng)了V教學(xué)法等軟件人才培養(yǎng)的模式先河。學(xué)校采用“理論+實(shí)踐”并行的教學(xué)方式,使學(xué)生在這兩者的結(jié)合中掌握一技之長,為社會培養(yǎng)和輸送了大量的高級軟件人才。
學(xué)校坐落于西安軟件園交大捷普大廈,環(huán)境優(yōu)美,更與國內(nèi)外知名軟件企業(yè)毗鄰,人文氣息濃厚。學(xué)校擁有自己的網(wǎng)站和機(jī)房供學(xué)生進(jìn)行軟件開發(fā)、設(shè)計等課程的實(shí)踐。同時學(xué)校也是西安工業(yè)大學(xué)計算機(jī)與工程學(xué)院、陜西國際商貿(mào)學(xué)院、西安財經(jīng)學(xué)院統(tǒng)計學(xué)院、陜西科技大學(xué)理學(xué)院、楊陵職業(yè)技術(shù)學(xué) 院等大學(xué)的實(shí)習(xí)就業(yè)項(xiàng)訓(xùn)基地。
開設(shè)課程軟件編程培訓(xùn),android高級課程,iphone高級課程
招生對象
1.iPhone培訓(xùn)課程面向希望把握歷史性機(jī)遇,希望成為iPhone手機(jī)軟件開發(fā)的緊缺人才。
2.計算機(jī)相關(guān)專業(yè)、大專以及以上學(xué)歷。
3.本課程同樣適用于希望了解iPhone手機(jī)軟件開發(fā),為未來業(yè)務(wù)轉(zhuǎn)型奠定基礎(chǔ)的企業(yè)技術(shù)團(tuán)隊(duì)。
免費(fèi)復(fù)訓(xùn) + 企業(yè)進(jìn)階課程 + 終身輔導(dǎo)
我們?yōu)閷W(xué)員專門開設(shè)QQ群、技術(shù)博客、微博等,學(xué)員到企業(yè)之后,如在技術(shù)和職業(yè)方向遇到任何瓶頸,都可以向?qū)熣埥獭N覀儽3謱π袠I(yè)和技術(shù)的高度敏感,不斷優(yōu)化和豐富課程內(nèi)容,這些新技術(shù)畢業(yè)學(xué)員都可以免費(fèi)學(xué)習(xí),同時定期舉辦的技術(shù)講座和活動,也是對學(xué)員免費(fèi)開放的。
第二篇:JAVA編程心得體會
JAVA編程心得
計算機(jī)3班
竇金霞
20104773
最近幾周一直在弄程序,說實(shí)話真的很累,但累中也有成功的快樂。我覺得學(xué)到了很多東西,這是只看課本知識所不能學(xué)到的。
說實(shí)話,以前我一直沒學(xué)過JAVA雖然我也知道JAVA的重要性,可是即使上課聽了,不實(shí)踐還是掌握不了。因?yàn)榉N種原因,今年我沒有買筆記本。沒有機(jī)器,僅僅靠每周一次的上機(jī)練習(xí)是絕對不夠的。所以我就插空調(diào)程序,在舍友們不用的時候自己再接她們的電腦調(diào)。
調(diào)上一個WEB版的通訊錄程序時我已經(jīng)感覺到學(xué)的很吃力,好多東西都不懂。這次做的這個學(xué)生成績管理系統(tǒng)更復(fù)雜了,所以一開始調(diào)的時候感覺特別吃力.所以我告訴自己不能放棄,慢慢來,就這樣我從最基本的sql語句session對象開始學(xué)起,我覺得我還有太多不懂得所以要比別人付出更多的努力。就這樣我一點(diǎn)一點(diǎn)的學(xué)著??
說心里話,在做上一個web版的通訊錄時,我就感覺到成功的喜悅。好多地方我都是一點(diǎn)一點(diǎn)的問的,在問的過程中,我也學(xué)會了很多,像:Servlet和jsp之間跳不過去時有兩種解決辦法,一是關(guān)閉底層類中的db.close;二是將Servlet中的throws Exception改成try catch以捕捉異常;我還學(xué)到了集中查找錯誤的方法,可以加上兩個雙斜杠“//”將具體的方法屏蔽掉,一檢查是方法錯誤還是Servlet錯誤,還有就是寫上System.out.println()將獲得的數(shù)據(jù)輸出,用來檢查數(shù)據(jù)傳輸過程有沒有錯誤等等。
雖然在別人看來,這些方法可能都很常規(guī),但是確實(shí)我自己學(xué)會的,我覺得很有成就感。我已經(jīng)做好計劃了,暑假的時候去買本本用自己的本本練習(xí)一下JAVA,雖然下學(xué)期不學(xué)JAVA了,但是我對JAVA的熱情不會因?yàn)檫@個而削減的!
做完這個學(xué)生成績管理系統(tǒng)后,我覺得我對JAVA的看法已經(jīng)改變了。一前總以為JAVA很繁瑣很難,聽同學(xué)說JAVA不好學(xué),開始又有一些聽不懂,所以一直很畏懼JAVA。但真正做了這個系統(tǒng)以后我才感覺到其實(shí)任何事都沒有難與不難之分,只要你肯努力的去做,世上無難事只怕有心人!
我現(xiàn)在對java學(xué)習(xí)充滿了熱情,我知道我還有很多的不足
還有很多需要努力的地方,所以我的JAVA之旅將繼續(xù)進(jìn)行??
第三篇:java軟件培訓(xùn)實(shí)習(xí)報告.
實(shí)習(xí)報告
一、實(shí)習(xí)時間 2013.01.08--2013.05.18
二、實(shí)習(xí)地點(diǎn)
無錫 NIIT 軟件服務(wù)外包實(shí)訓(xùn)基地
三、實(shí)習(xí)目的
進(jìn)一步了解 Java 開發(fā)的相關(guān)知識, 掌握 Java 開發(fā)的基本技術(shù), 豐富 Java 開發(fā)的實(shí)戰(zhàn)經(jīng) 驗(yàn)。學(xué)習(xí)SQL 的基礎(chǔ)知識及正確的運(yùn)用方法, ssh 等企業(yè)應(yīng)用框架和有用的相關(guān)技術(shù), 提高 自己的工作效率。通過實(shí)習(xí),培養(yǎng)我們綜合運(yùn)用已學(xué)知識 Java 語言的面向?qū)ο缶幊棠芰?培養(yǎng)我們動手能力;培養(yǎng)我們良好編程規(guī)范、編程方法;以便能較全面地理解、掌握和綜合 運(yùn)用所學(xué)的知識, 提高自身的編程能力;增強(qiáng)自己的團(tuán)隊(duì)協(xié)作意識, 了解軟件開發(fā)的思考角 度和主要流程。為畢業(yè)之后能夠更快地進(jìn)入工作狀態(tài)并且能夠更好的工作, 打好一定的基礎(chǔ)。
四、實(shí)習(xí)內(nèi)容概要
應(yīng)用 java 基礎(chǔ)、MySQL 數(shù)據(jù)庫、Servlet 技術(shù)、JSP 頁面設(shè)計、JQuery、ajax、hibernate、struts2、spring、xml 等技術(shù)完成網(wǎng)站后臺的開發(fā)。
五、實(shí)習(xí)內(nèi)容 5.1 java基礎(chǔ)知識
Java 的基礎(chǔ)知識對于一個 java 軟件工程師來說就好比是人的靈魂,現(xiàn)在的公司 在招聘的時候不在乎你會不會流行的技術(shù),如(Struts、Hibernate、Spring、ibatis 等 他看重的 是你的基礎(chǔ)扎不扎實(shí), 對于網(wǎng)易、騰訊等大公司來說更是如此, 我們在開發(fā)過程中運(yùn)用了大 量的 java 基礎(chǔ)知識,如類、對象、方法、成員變量、靜
態(tài)變量、封裝、繼承、多態(tài)、異常、接口、抽象類、IO 流?等等等等,所以一個系統(tǒng)對于 java 編程基礎(chǔ)的依賴便不言而喻。
5.2MySQL、Oracle 數(shù)據(jù)庫的介紹
MySQL 是最流行的開放源碼 SQL 數(shù)據(jù)庫管理系統(tǒng),它是由 MySQL AB公司開發(fā)、發(fā) 布并支持的。MySQL AB是由多名 MySQL 開發(fā)人創(chuàng)辦的一家商業(yè)公司。它是一家第二代開 放源碼公司, 結(jié)合了開放源碼價值取向、方法和成功的商業(yè)模型。Oracle 則是以穩(wěn)定性著稱, 在訪問量和數(shù)據(jù)大量交換的服務(wù)器中, Oracle 占了大臂的江山, 在開發(fā)中主要用到了數(shù)據(jù)庫 的查詢語句、數(shù)據(jù)庫的關(guān)系、事物等
5.3 Java中的常用設(shè)計模式 5.3.1 工廠模式
客戶類和工廠類分開。消費(fèi)者任何時候需要某種產(chǎn)品, 只需向工廠請求即可。消費(fèi)者無 須修改就可以接納新產(chǎn)品。缺點(diǎn)是當(dāng)產(chǎn)品修改時, 工廠類也要做相應(yīng)的修改。如:如何創(chuàng)建 及如何向客戶端提供。
5.3.2 單例模式
單例模式的意思就是只有一個實(shí)例。單例模式確保某一個類只有一個實(shí)例, 而且自行實(shí) 例化并向整個系統(tǒng)提供這個實(shí)例。這個類稱為單例類。
5.4 Servlet & JSP技術(shù)的介紹 5.4.1 什么是 Servlet 一個 servlet 就是 Java 編程語言中的一個類,它被用來擴(kuò)展服務(wù)器的性能,服務(wù)器上駐 留著可以通過“請求-響應(yīng)”編程模型來訪問的應(yīng)用程序。雖然 servlet 可以對任何類型的請 求產(chǎn)生響應(yīng),但通常只用來擴(kuò)展 Web 服務(wù)器的應(yīng)用程序。Java Servlet技術(shù)為這些應(yīng)用程序 定義了一個特定于 HTTP 的 servlet類。
javax.servlet 和 javax.servlet.http 包為編寫 servlet 提供了接口和類。所有的 servlet 都必 須實(shí)現(xiàn) Servlet 接口,該接口定義了生命周期方法。
5.4.2 Servlet的生命周期
一個 servlet 的生命周期由部署 servlet 的容器來控制。當(dāng)一個請求映射到一個 servlet 時, 該容器執(zhí)行下列步驟。
5.4.3 JSP介紹
JSP 是由 Sun Microsystems公司倡導(dǎo)、許多公司參與一起建立的一種動態(tài)技術(shù)標(biāo)準(zhǔn)。在 傳統(tǒng)的網(wǎng)頁 HTML 文件(*.htm, *.html中加入 Java 程序 片段(Scriptlet 和 JSP 標(biāo)簽, 就構(gòu)成了 JSP 網(wǎng)頁 java 程序片段可以操縱數(shù)據(jù)庫、重新定向網(wǎng)頁以及發(fā)送 E-mail 等,實(shí)現(xiàn) 建立動態(tài)網(wǎng)站所 需要的功能。所有程序操作都在服務(wù)器端執(zhí)行,網(wǎng)絡(luò)上傳送給客戶端的僅 是得到的結(jié)果,這樣大大降低了對客戶瀏覽器的要求,即使客戶瀏覽器端不支持 Java , 也 可以訪問 JSP 網(wǎng)頁。
5.4.4 JSP & Servlet Java Servlet是 JSP 技術(shù)的基礎(chǔ), 而且大型的 Web 應(yīng)用程序的開發(fā)需要 Java Servlet和 JSP 配合才能完成?,F(xiàn)在許多 Web 服務(wù)器都支持 Servlet , 即使不直接支持 Servlet 的 Web 服務(wù)器, 也可以通過附件的應(yīng)用服務(wù)器和模塊來支持 Servlet ,這得益于 Java 的跨平臺特性。另外, 由于 Servlet 內(nèi)部以線程方式提供提供服務(wù),不必對于每個請求都啟動一個進(jìn)程,并且利用 多線程機(jī)制可以同時為多個請求服務(wù),因此 Servlet 的效率非常高。
5.5 MVC 模式
為了把表現(xiàn)層 presentation 從請求處理 request processing 和數(shù)據(jù)存儲 data storage中分離 開來, SUN 公司推薦在 JSP 文件中使用一種“模型-視圖-控制器” Model-view-controller 模 式。規(guī)范的 SERVLET 或者分離的 JSP 文件用于處理請求。當(dāng)請求處理完后,控制權(quán)交給一
個只作為創(chuàng)建輸出作用的 JSP 頁。有幾種平臺都基于服務(wù)于網(wǎng)絡(luò)層的模-視圖-控件 模式(比 如 Struts 和 Spring framework。
5.6 xml & jquery & ajax 5.6.1 xml Xml 是用于標(biāo)記電子文件使其具有結(jié)構(gòu)性的標(biāo)記語言,可以用來標(biāo)記 數(shù)據(jù)、定義數(shù)據(jù)類型,是一種允許用戶對自己的標(biāo)記語言進(jìn)行定義的源語言。主要學(xué)習(xí)了 xml 的語法與讀取 xml。
5.6.2 jquery query 是繼 prototype 之后又一個優(yōu)秀的 Javascript 框架, jQuery 使用戶能更方便地處理 HTML documents、events、實(shí)現(xiàn)動畫效果, jQuery 還有一個比較大的優(yōu)勢是,它的文檔說明 很全, 而且各種應(yīng)用也說得很詳細(xì), 同時還有許多成熟的插件可供選擇。jQuery 能夠使用戶 的 html 頁保持代碼和 html 內(nèi)容分離,也就是說,不用再在 html 里面插入一堆 js 來調(diào)用命 令了,只需定義 id 即可。
5.6.3 ajax Ajax 的核心是 JavaScript 對象 XmlHttpRequest。該對象在 Internet Explorer 5中首次引入,它是一種支持異步請求的技術(shù)。簡而言之, XmlHttpRequest 使您可 以使用 JavaScript 向服務(wù)器提出請求并處理響應(yīng),而不阻塞用戶, AJAX 不是一種新的編程 語言,而是一種用于創(chuàng)建更好更快以及交互性更強(qiáng)的 Web 應(yīng)用程序的技術(shù)。
5.7三大框架 5.7.1 Struts2 Struts 2是 Struts 的下一代產(chǎn)品,是在 struts 1和 WebWork 的技術(shù)基礎(chǔ)上進(jìn)行了
合并的全新的 Struts 2框架。其全新的 Struts 2的體系結(jié)構(gòu)與 Struts 1的體系結(jié)構(gòu)差別巨大。Struts 2以 WebWork 為核心, 采用攔截器的機(jī)制來處理用戶的請求, 這樣的設(shè)計也使得業(yè)務(wù) 邏輯控制器能夠與 Servlet API完全脫離開, 所以 Struts 2可以理解為 WebWork 的更新產(chǎn)品。雖然從 Struts 1到 Struts 2有著太大的變化,但是相對于 WebWork , Struts 2的變化很小。
5.7.2 Hibernate Hibernate 是一個開放源代碼的對象關(guān)系映射框架,它對 JDBC 進(jìn)行了非常輕量 級的對象封裝, 使得 Java 程序員可以隨心所欲的使用對象編程思維來操縱數(shù)據(jù)庫。Hibernate可以應(yīng)用在任何使用 JDBC 的場合, 既可以在 Java 的客戶端程序使用, 也可以在 Servlet/JSP的 Web 應(yīng)用中使用, 最具革命意義的是, Hibernate 可以在應(yīng)用 EJB 的 J2EE 架構(gòu)中取代 CMP , 完成數(shù)據(jù)持久化的重任。
5.7.3 Spring spring 在英文里有春天、彈簧、跳躍和泉眼的意思。Spring 也表示是 一個開源框架,是為了解決企業(yè)應(yīng)用程序開發(fā)復(fù)雜性由 Rod Johnson創(chuàng)建的??蚣艿闹饕獌?yōu) 勢之一就是其分層架構(gòu),分層架構(gòu)允許使用者選擇使用哪一個組件,同時為 J2EE 應(yīng)用程序 開發(fā)提供集成的框架。Spring 使用基本的 JavaBean 來完成以前只可能由 EJB 完成的事情。
然而, Spring 的用途不僅限于服務(wù)器端的開發(fā)。從簡單性、可測試性和松耦合的角度而言, 任何 Java 應(yīng)用都可以從 Spring 中受益。
六、實(shí)習(xí)總結(jié)及體會
通過這次實(shí)習(xí)機(jī)會,我主要學(xué)習(xí)了以上這些 java 編程的技術(shù),同時也明白了身處公司 中如何更好地與同事配合, 畢竟在軟件開發(fā)中, 你不可能一個人干完一個系統(tǒng), 大家都是通 過 svn 等團(tuán)隊(duì)管理工具互相配合完成編程任務(wù)。在實(shí)習(xí)之前, 我對軟件開發(fā)的過程只有一個 模糊地印象, 以為只要把代碼編寫完之后就算基本上一個項(xiàng)目
開發(fā)完畢了。然而通過這次實(shí)習(xí), 徹底顛覆了我的認(rèn)知, 我當(dāng)時的認(rèn)知無疑是非常幼稚和可笑的, 完全的軟件開發(fā)過程不 只只是編寫代碼, 在編寫代碼之前還有好多的事情要做, 比如文檔的編寫、對項(xiàng)目進(jìn)行需求 分析、數(shù)據(jù)庫設(shè)計等等。代碼編寫完成之后還要進(jìn)行測試,以及人員的培訓(xùn),這些都是必須 做,也是必不可少的項(xiàng)目,甚至比代碼的編寫還重要。
以前總是覺得自己干不好編程,沒有足夠的自信,但通過一系列知識的學(xué)習(xí),還有人 際交往能力的提高,我漸漸地認(rèn)識到如果個人想要在公司立足,除了要有扎實(shí)的知識基礎(chǔ), 還必須具備良好的交流溝通能力, 雖然現(xiàn)在我在公司基本沒出現(xiàn)加班的情況, 但做這一行就 得做好心里準(zhǔn)備,時刻準(zhǔn)備戰(zhàn)斗,對于我們現(xiàn)在這個階段來說,實(shí)踐就是提高的唯一捷徑, 在這個關(guān)鍵的階段中,你必須做到肯吃苦,不怕累,讓知識和技能來充實(shí)你的生活,但你回 想這一刻的時候, 你并不在乎當(dāng)初賺的工資是多少, 上班的時間是多久, 你只在乎的是你的 技能、經(jīng)驗(yàn)、人際關(guān)系的提高,這樣會給你帶來一種成就感,對于即將畢業(yè)的大學(xué)生來說, 經(jīng)驗(yàn)與經(jīng)歷是你以后發(fā)展的敲門磚, 即將面對社會的我們, 再也沒有校園那一堵堵圍墻能給 我們安全感并保護(hù)著我們, 我們需要面對社會, 同其他人競爭, 如果你現(xiàn)在還在糾結(jié)這份工 作很辛苦、工資很低,那你就錯了, 你要糾結(jié)的是這份工作能不能學(xué)到東西,你的能力跟你 的報酬對不對等, 如果當(dāng)你發(fā)現(xiàn)你的能力跟你的報酬嚴(yán)重不對等或是沒東西學(xué)習(xí)的時候, 那 時你可以選擇到別的地方發(fā)展。
現(xiàn)在的我沒事也會去一些 java 的 QQ 群跟大家交流一番,在這里你能找到很多程序猿(程序員的網(wǎng)絡(luò)叫法 , 大家一起討論技術(shù), 討論問題, 探討人生, 雖然很多時候都是在八卦, 但只有他們才能理解這個職業(yè)的艱辛,才能與你感同身受。我在開發(fā)期間也遇到很多問題, 但是我會試著到網(wǎng)絡(luò)去找答案, 如果實(shí)在找不到我會試著問問我的上級, 或者跟一些朋友討 論一下, 如果發(fā)現(xiàn)了這個問題的答案我會及時把它記錄下來, 方便以后遇到問題可以隨時翻 閱, 我相信好記性不如爛筆頭這句話, 我也相信如果一個程序員寫的代碼沒有錯誤那只能證 明他沒寫過代碼, 雖然我比較懶, 但我現(xiàn)在有空的時候都會對著電腦敲代碼, 我相信手感是 敲出來的,你看 10遍都不如你敲一遍來得印象深刻。
通過這次實(shí)習(xí),我認(rèn)識到了一個軟件開發(fā)的完整的過程,為我今后進(jìn)行實(shí)際的工作奠定了 堅(jiān)實(shí)的基礎(chǔ)。首先,進(jìn)入公司,你就是一名職業(yè)人,不再是一名學(xué)生,你要具備一名職業(yè)人 應(yīng)具備的素養(yǎng), 不遲到不早退是必然的, 而且還要時刻嚴(yán)格要求自己, 公司的規(guī)定要嚴(yán)格遵 守。然后, 在技術(shù)上也有了很大的提高, 學(xué)習(xí)了很多公司自己的框架和工具,這都是一些前 輩的寶貴經(jīng)驗(yàn)。而且所作的軟件應(yīng)用性更強(qiáng)。所以,在今后的學(xué)習(xí)中我會嚴(yán)于律己,認(rèn)真學(xué)習(xí)有關(guān)軟件編程的課,為以后的工作打好堅(jiān)實(shí)的基礎(chǔ)。
第四篇:軟件編程學(xué)習(xí)心得
軟件編程學(xué)習(xí)心得
隨著計算機(jī)技術(shù)的發(fā)展和工作的需要,為了能夠更好的維護(hù)公司生產(chǎn)管理系統(tǒng);公司安排我們到北大青鳥APTECH進(jìn)修。我們選擇了時下最流行、發(fā)展速度較快的語言C#。C#學(xué)習(xí)共分三個階段,目前我只學(xué)習(xí)了第一個階段;現(xiàn)將我在北大青鳥學(xué)習(xí)第一階段為期兩個月的學(xué)習(xí)心得總結(jié)如下:
C#是一種新的面向?qū)ο蟮木幊陶Z言,專門用于.NET運(yùn)行時。C#編譯器只能生成受管制的代碼,也可以使用.NET基類。C#語言自C/C++演變而來。但是,它具有簡單、現(xiàn)代、完全面向?qū)ο蠛皖愋桶踩戎T多特性。下面就簡單說說簡單和現(xiàn)代其中兩種特性。
1、簡單
C#具有C++所沒有的一個優(yōu)勢就是學(xué)習(xí)簡單。該語言首要的目標(biāo)就是簡單。很多功能(還不如說是缺少了C++的一些功能)有助于C#全方位的簡單。
在C#中,沒有C++中流行的指針。默認(rèn)地,您工作在受管理的代碼中,在那里不允許如直接存取內(nèi)存等不安全的操作。我想沒有C++程序員可以聲稱,從沒有使用指針訪問過不屬于他們的內(nèi)存。
C#棄用其它操作符,名字空間、成員和引用僅使用單個操作符 “.”?,F(xiàn)在一個程序員所需要理解的就是嵌套名字的注解了。
C#使用統(tǒng)一的類型系統(tǒng)。這種系統(tǒng)充許您把各種類型作為一個對象查看,它是一個原始類型還是一個full-blown 類。和其它編程語言相比,由于加框(boxing)和消框(unboxing)的機(jī)制,把簡單類型當(dāng)作對象處理并不能獲得性能的改善。稍后將詳細(xì)解釋加框和消框,但基本上僅當(dāng)需要時才使用對象訪問簡單類型這種技術(shù)。
2、現(xiàn)代
投入學(xué)習(xí)C#的努力是一筆大投資,因?yàn)镃#是為編寫NGWS 應(yīng)用程序的主要語言而設(shè)計。很多用C++可以實(shí)現(xiàn)或者很費(fèi)力實(shí)現(xiàn)的功能,在C#中不過是一部分基本的功能而已。根據(jù)應(yīng)用程序的特殊需求,可以很容易地創(chuàng)建出新的一種數(shù)據(jù)類型。
指針不再是編程武器的一部分。運(yùn)行時NGWS提供了一個垃圾收集器,負(fù)責(zé)C#程序中的內(nèi)存管理。因內(nèi)存和應(yīng)用程序都受到管理,所以很必要增強(qiáng)類型安全,以確保應(yīng)用的穩(wěn)定性。
異常處理是C#的主要功能。C#的異常處理與C++的不同點(diǎn)在于它是交叉語言的(運(yùn)行時的另一個功能)。在沒有C#之前,您必須處理怪異的HRESULTs,但現(xiàn)在由于使用了基于異常的健壯的出錯處理,這一切都結(jié)束了。
對于現(xiàn)代的應(yīng)用程序,安全是首要的,C#也不會例外。它提供了元數(shù)據(jù)語法,用于聲明下述NGWS安全模式的能力和許可。元數(shù)據(jù)是NGWS運(yùn)行時的一個關(guān)鍵的概念。
通兩個多月學(xué)習(xí),我能夠很好的掌握C#語言的基本語句、語法以及老師補(bǔ)充的一些要點(diǎn);能夠編寫簡單的應(yīng)用程序,例如電子郵件的收發(fā)等,為接下來的第二、第三階段學(xué)習(xí)打下了良好的基礎(chǔ)。
第五篇:Java多線程編程總結(jié)
Java多線程編程總結(jié)
2007-05-17 11:21:59 標(biāo)簽:java 多線程
原創(chuàng)作品,允許轉(zhuǎn)載,轉(zhuǎn)載時請務(wù)必以超鏈接形式標(biāo)明文章 原始出處、作者信息和本聲明。否則將追究法律責(zé)任。http://lavasoft.blog.51cto.com/62575/27069
Java多線程編程總結(jié)
下面是Java線程系列博文的一個編目:
Java線程:概念與原理 Java線程:創(chuàng)建與啟動
Java線程:線程棧模型與線程的變量 Java線程:線程狀態(tài)的轉(zhuǎn)換 Java線程:線程的同步與鎖 Java線程:線程的交互 Java線程:線程的調(diào)度-休眠 Java線程:線程的調(diào)度-優(yōu)先級 Java線程:線程的調(diào)度-讓步 Java線程:線程的調(diào)度-合并 Java線程:線程的調(diào)度-守護(hù)線程 Java線程:線程的同步-同步方法 Java線程:線程的同步-同步塊
Java線程:并發(fā)協(xié)作-生產(chǎn)者消費(fèi)者模型 Java線程:并發(fā)協(xié)作-死鎖 Java線程:volatile關(guān)鍵字 Java線程:新特征-線程池
Java線程:新特征-有返回值的線程 Java線程:新特征-鎖(上)Java線程:新特征-鎖(下)Java線程:新特征-信號量 Java線程:新特征-阻塞隊(duì)列 Java線程:新特征-阻塞棧 Java線程:新特征-條件變量 Java線程:新特征-原子量 Java線程:新特征-障礙器 Java線程:大總結(jié)
----
下面的內(nèi)容是很早之前寫的,內(nèi)容不夠充實(shí),而且是基于Java1.4的內(nèi)容,Java5之后,線程并發(fā)部分?jǐn)U展了相當(dāng)多的內(nèi)容,因此建議大家看上面的系列文章的內(nèi)容,與時俱進(jìn),跟上Java發(fā)展的步伐。----
一、認(rèn)識多任務(wù)、多進(jìn)程、單線程、多線程 要認(rèn)識多線程就要從操作系統(tǒng)的原理說起。
以前古老的DOS操作系統(tǒng)(V 6.22)是單任務(wù)的,還沒有線程的概念,系統(tǒng)在每次只能做一件事情。比如你在copy東西的時候不能rename文件名。為了提高系統(tǒng)的利用效率,采用批處理來批量執(zhí)行任務(wù)。
現(xiàn)在的操作系統(tǒng)都是多任務(wù)操作系統(tǒng),每個運(yùn)行的任務(wù)就是操作系統(tǒng)所做的一件事情,比如你在聽歌的同時還在用MSN和好友聊天。聽歌和聊天就是兩個任務(wù),這個兩個任務(wù)是“同時”進(jìn)行的。一個任務(wù)一般對應(yīng)一個進(jìn)程,也可能包含好幾個進(jìn)程。比如運(yùn)行的MSN就對應(yīng)一個MSN的進(jìn)程,如果你用的是windows系統(tǒng),你就可以在任務(wù)管理器中看到操作系統(tǒng)正在運(yùn)行的進(jìn)程信息。
一般來說,當(dāng)運(yùn)行一個應(yīng)用程序的時候,就啟動了一個進(jìn)程,當(dāng)然有些會啟動多個進(jìn)程。啟動進(jìn)程的時候,操作系統(tǒng)會為進(jìn)程分配資源,其中最主要的資源是內(nèi)存空間,因?yàn)槌绦蚴窃趦?nèi)存中運(yùn)行的。在進(jìn)程中,有些程序流程塊是可以亂序執(zhí)行的,并且這個代碼塊可以同時被多次執(zhí)行。實(shí)際上,這樣的代碼塊就是線程體。線程是進(jìn)程中亂序執(zhí)行的代碼流程。當(dāng)多個線程同時運(yùn)行的時候,這樣的執(zhí)行模式成為并發(fā)執(zhí)行。
多線程的目的是為了最大限度的利用CPU資源。
Java編寫程序都運(yùn)行在在Java虛擬機(jī)(JVM)中,在JVM的內(nèi)部,程序的多任務(wù)是通過線程來實(shí)現(xiàn)的。每用java命令啟動一個java應(yīng)用程序,就會啟動一個JVM進(jìn)程。在同一個JVM進(jìn)程中,有且只有一個進(jìn)程,就是它自己。在這個JVM環(huán)境中,所有程序代碼的運(yùn)行都是以線程來運(yùn)行。
一般常見的Java應(yīng)用程序都是單線程的。比如,用java命令運(yùn)行一個最簡單的HelloWorld的Java應(yīng)用程序時,就啟動了一個JVM進(jìn)程,JVM找到程序程序的入口點(diǎn)main(),然后運(yùn)行main()方法,這樣就產(chǎn)生了一個線程,這個線程稱之為主線程。當(dāng)main方法結(jié)束后,主線程運(yùn)行完成。JVM進(jìn)程也隨即退出。
對于一個進(jìn)程中的多個線程來說,多個線程共享進(jìn)程的內(nèi)存塊,當(dāng)有新的線程產(chǎn)生的時候,操作系統(tǒng)不分配新的內(nèi)存,而是讓新線程共享原有的進(jìn)程塊的內(nèi)存。因此,線程間的通信很容易,速度也很快。不同的進(jìn)程因?yàn)樘幱诓煌膬?nèi)存塊,因此進(jìn)程之間的通信相對困難。
實(shí)際上,操作的系統(tǒng)的多進(jìn)程實(shí)現(xiàn)了多任務(wù)并發(fā)執(zhí)行,程序的多線程實(shí)現(xiàn)了進(jìn)程的并發(fā)執(zhí)行。多任務(wù)、多進(jìn)程、多線程的前提都是要求操作系統(tǒng)提供多任務(wù)、多進(jìn)程、多線程的支持。
在Java程序中,JVM負(fù)責(zé)線程的調(diào)度。線程調(diào)度是值按照特定的機(jī)制為多個線程分配CPU的使用權(quán)。調(diào)度的模式有兩種:分時調(diào)度和搶占式調(diào)度。分時調(diào)度是所有線程輪流獲得CPU使用權(quán),并平均分配每個線程占用CPU的時間;搶占式調(diào)度是根據(jù)線程的優(yōu)先級別來獲取CPU的使用權(quán)。JVM的線程調(diào)度模式采用了搶占式模式。
所謂的“并發(fā)執(zhí)行”、“同時”其實(shí)都不是真正意義上的“同時”。眾所周知,CPU都有個時鐘頻率,表示每秒中能執(zhí)行cpu指令的次數(shù)。在每個時鐘周期內(nèi),CPU實(shí)際上只能去執(zhí)行一條(也有可能多條)指令。操作系統(tǒng)將進(jìn)程線程進(jìn)行管理,輪流(沒有固定的順序)分配每個進(jìn)程很短的一段是時間(不一定是均分),然后在每個線程內(nèi)部,程序代碼自己處理該進(jìn)程內(nèi)部線程的時間分配,多個線程之間相互的切換去執(zhí)行,這個切換時間也是非常短的。因此多任務(wù)、多進(jìn)程、多線程都是操作系統(tǒng)給人的一種宏觀感受,從微觀角度看,程序的運(yùn)行是異步執(zhí)行的。
用一句話做總結(jié):雖然操作系統(tǒng)是多線程的,但CPU每一時刻只能做一件事,和人的大腦是一樣的,呵呵。
二、Java與多線程
Java語言的多線程需要操作系統(tǒng)的支持。
Java 虛擬機(jī)允許應(yīng)用程序并發(fā)地運(yùn)行多個執(zhí)行線程。Java語言提供了多線程編程的擴(kuò)展點(diǎn),并給出了功能強(qiáng)大的線程控制API。
在Java中,多線程的實(shí)現(xiàn)有兩種方式: 擴(kuò)展java.lang.Thread類 實(shí)現(xiàn)java.lang.Runnable接口
每個線程都有一個優(yōu)先級,高優(yōu)先級線程的執(zhí)行優(yōu)先于低優(yōu)先級線程。每個線程都可以或不可以標(biāo)記為一個守護(hù)程序。當(dāng)某個線程中運(yùn)行的代碼創(chuàng)建一個新 Thread 對象時,該新線程的初始優(yōu)先級被設(shè)定為創(chuàng)建線程的優(yōu)先級,并且當(dāng)且僅當(dāng)創(chuàng)建線程是守護(hù)線程時,新線程才是守護(hù)程序。
當(dāng) Java 虛擬機(jī)啟動時,通常都會有單個非守護(hù)線程(它通常會調(diào)用某個指定類的 main 方法)。Java 虛擬機(jī)會繼續(xù)執(zhí)行線程,直到下列任一情況出現(xiàn)時為止:
調(diào)用了 Runtime 類的 exit 方法,并且安全管理器允許退出操作發(fā)生。
非守護(hù)線程的所有線程都已停止運(yùn)行,無論是通過從對 run 方法的調(diào)用中返回,還是通過拋出一個傳播到 run 方法之外的異常。
三、擴(kuò)展java.lang.Thread類
/** * File Name: TestMitiThread.java * Created by: IntelliJ IDEA.* Copyright: Copyright(c)2003-2006 * Company: Lavasoft([url]http://lavasoft.blog.51cto.com/[/url])* Author: leizhimin * Modifier: leizhimin * Date Time: 2007-5-17 10:03:12 * Readme: 通過擴(kuò)展Thread類實(shí)現(xiàn)多線程 */ public class TestMitiThread { public static void main(String[] rags){ System.out.println(Thread.currentThread().getName()+ “ 線程運(yùn)行開始!”);new MitiSay(“A”).start();new MitiSay(“B”).start();System.out.println(Thread.currentThread().getName()+ “ 線程運(yùn)行結(jié)束!”);} }
class MitiSay extends Thread { public MitiSay(String threadName){ super(threadName);}
public void run(){ System.out.println(getName()+ “ 線程運(yùn)行開始!”);for(int i = 0;i < 10;i++){ System.out.println(i + “ ” + getName());try { sleep((int)Math.random()* 10);} catch(InterruptedException e){ e.printStackTrace();} } System.out.println(getName()+ “ 線程運(yùn)行結(jié)束!”);} }
運(yùn)行結(jié)果:
main 線程運(yùn)行開始!main 線程運(yùn)行結(jié)束!A 線程運(yùn)行開始!0 A 1 A B 線程運(yùn)行開始!2 A 0 B 3 A 4 A 1 B 5 A 6 A 7 A 8 A 9 A A 線程運(yùn)行結(jié)束!2 B 3 B 4 B 5 B 6 B 7 B 8 B 9 B B 線程運(yùn)行結(jié)束!說明:
程序啟動運(yùn)行main時候,java虛擬機(jī)啟動一個進(jìn)程,主線程main在main()調(diào)用時候被創(chuàng)建。隨著調(diào)用MitiSay的兩個對象的start方法,另外兩個線程也啟動了,這樣,整個應(yīng)用就在多線程下運(yùn)行。
在一個方法中調(diào)用Thread.currentThread().getName()方法,可以獲取當(dāng)前線程的名字。在mian方法中調(diào)用該方法,獲取的是主線程的名字。
注意:start()方法的調(diào)用后并不是立即執(zhí)行多線程代碼,而是使得該線程變?yōu)榭蛇\(yùn)行態(tài)(Runnable),什么時候運(yùn)行是由操作系統(tǒng)決定的。
從程序運(yùn)行的結(jié)果可以發(fā)現(xiàn),多線程程序是亂序執(zhí)行。因此,只有亂序執(zhí)行的代碼才有必要設(shè)計為多線程。
Thread.sleep()方法調(diào)用目的是不讓當(dāng)前線程獨(dú)自霸占該進(jìn)程所獲取的CPU資源,以留出一定時間給其他線程執(zhí)行的機(jī)會。
實(shí)際上所有的多線程代碼執(zhí)行順序都是不確定的,每次執(zhí)行的結(jié)果都是隨機(jī)的。
四、實(shí)現(xiàn)java.lang.Runnable接口
/** * 通過實(shí)現(xiàn) Runnable 接口實(shí)現(xiàn)多線程 */ public class TestMitiThread1 implements Runnable {
public static void main(String[] args){ System.out.println(Thread.currentThread().getName()+ “ 線程運(yùn)行開始!”);TestMitiThread1 test = new TestMitiThread1();Thread thread1 = new Thread(test);Thread thread2 = new Thread(test);thread1.start();thread2.start();System.out.println(Thread.currentThread().getName()+ “ 線程運(yùn)行結(jié)束!”);}
public void run(){ System.out.println(Thread.currentThread().getName()+ “ 線程運(yùn)行開始!”);for(int i = 0;i < 10;i++){ System.out.println(i + “ ” + Thread.currentThread().getName());try { Thread.sleep((int)Math.random()* 10);} catch(InterruptedException e){ e.printStackTrace();} } System.out.println(Thread.currentThread().getName()+ “ 線程運(yùn)行結(jié)束!”);} }
運(yùn)行結(jié)果:
main 線程運(yùn)行開始!Thread-0 線程運(yùn)行開始!main 線程運(yùn)行結(jié)束!0 Thread-0 Thread-1 線程運(yùn)行開始!0 Thread-1 1 Thread-1 1 Thread-0 2 Thread-0 2 Thread-1 3 Thread-0 3 Thread-1 4 Thread-0 4 Thread-1 5 Thread-0 6 Thread-0 5 Thread-1 7 Thread-0 8 Thread-0 6 Thread-1 9 Thread-0 7 Thread-1 Thread-0 線程運(yùn)行結(jié)束!8 Thread-1 9 Thread-1 Thread-1 線程運(yùn)行結(jié)束!說明:
TestMitiThread1類通過實(shí)現(xiàn)Runnable接口,使得該類有了多線程類的特征。run()方法是多線程程序的一個約定。所有的多線程代碼都在run方法里面。Thread類實(shí)際上也是實(shí)現(xiàn)了Runnable接口的類。
在啟動的多線程的時候,需要先通過Thread類的構(gòu)造方法Thread(Runnable target)構(gòu)造出對象,然后調(diào)用Thread對象的start()方法來運(yùn)行多線程代碼。
實(shí)際上所有的多線程代碼都是通過運(yùn)行Thread的start()方法來運(yùn)行的。因此,不管是擴(kuò)展Thread類還是實(shí)現(xiàn)Runnable接口來實(shí)現(xiàn)多線程,最終還是通過Thread的對象的API來控制線程的,熟悉Thread類的API是進(jìn)行多線程編程的基礎(chǔ)。
五、讀解Thread類API
static int MAX_PRIORITY 線程可以具有的最高優(yōu)先級。static int MIN_PRIORITY 線程可以具有的最低優(yōu)先級。static int NORM_PRIORITY 分配給線程的默認(rèn)優(yōu)先級。
構(gòu)造方法摘要
Thread(Runnable target)分配新的 Thread 對象。Thread(String name)分配新的 Thread 對象。
方法摘要
static Thread currentThread()返回對當(dāng)前正在執(zhí)行的線程對象的引用。ClassLoader getContextClassLoader()返回該線程的上下文 ClassLoader。long getId()返回該線程的標(biāo)識符。String getName()返回該線程的名稱。int getPriority()返回線程的優(yōu)先級。Thread.State getState()返回該線程的狀態(tài)。ThreadGroup getThreadGroup()返回該線程所屬的線程組。static boolean holdsLock(Object obj)當(dāng)且僅當(dāng)當(dāng)前線程在指定的對象上保持監(jiān)視器鎖時,才返回 true。void interrupt()中斷線程。
static boolean interrupted()測試當(dāng)前線程是否已經(jīng)中斷。boolean isAlive()測試線程是否處于活動狀態(tài)。boolean isDaemon()測試該線程是否為守護(hù)線程。boolean isInterrupted()測試線程是否已經(jīng)中斷。void join()等待該線程終止。void join(long millis)等待該線程終止的時間最長為 millis 毫秒。void join(long millis, int nanos)等待該線程終止的時間最長為 millis 毫秒 + nanos 納秒。void resume()已過時。該方法只與 suspend()一起使用,但 suspend()已經(jīng)遭到反對,因?yàn)樗哂兴梨i傾向。有關(guān)更多信息,請參閱為何 Thread.stop、Thread.suspend 和 Thread.resume 遭到反對?。void run()如果該線程是使用獨(dú)立的 Runnable 運(yùn)行對象構(gòu)造的,則調(diào)用該 Runnable 對象的 run 方法;否則,該方法不執(zhí)行任何操作并返回。void setContextClassLoader(ClassLoader cl)設(shè)置該線程的上下文 ClassLoader。void setDaemon(boolean on)將該線程標(biāo)記為守護(hù)線程或用戶線程。
static void setDefaultUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh)設(shè)置當(dāng)線程由于未捕獲到異常而突然終止,并且沒有為該線程定義其他處理程序時所調(diào)用的默認(rèn)處理程序。void setName(String name)改變線程名稱,使之與參數(shù) name 相同。void setPriority(int newPriority)更改線程的優(yōu)先級。
void setUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh)設(shè)置該線程由于未捕獲到異常而突然終止時調(diào)用的處理程序。static void sleep(long millis)在指定的毫秒數(shù)內(nèi)讓當(dāng)前正在執(zhí)行的線程休眠(暫停執(zhí)行)。static void sleep(long millis, int nanos)在指定的毫秒數(shù)加指定的納秒數(shù)內(nèi)讓當(dāng)前正在執(zhí)行的線程休眠(暫停執(zhí)行)。void start()使該線程開始執(zhí)行;Java 虛擬機(jī)調(diào)用該線程的 run 方法。void stop()已過時。該方法具有固有的不安全性。用 Thread.stop 來終止線程將釋放它已經(jīng)鎖定的所有監(jiān)視器(作為沿堆棧向上傳播的未檢查 ThreadDeath 異常的一個自然后果)。如果以前受這些監(jiān)視器保護(hù)的任何對象都處于一種不一致的狀態(tài),則損壞的對象將對其他線程可見,這有可能導(dǎo)致任意的行為。stop 的許多使用都應(yīng)由只修改某些變量以指示目標(biāo)線程應(yīng)該停止運(yùn)行的代碼來取代。目標(biāo)線程應(yīng)定期檢查該變量,并且如果該變量指示它要停止運(yùn)行,則從其運(yùn)行方法依次返回。如果目標(biāo)線程等待很長時間(例如基于一個條件變量),則應(yīng)使用 interrupt 方法來中斷該等待。有關(guān)更多信息,請參閱《為何不贊成使用 Thread.stop、Thread.suspend 和 Thread.resume?》。void stop(Throwable obj)已過時。該方法具有固有的不安全性。請參閱 stop()以獲得詳細(xì)信息。該方法的附加危險是它可用于生成目標(biāo)線程未準(zhǔn)備處理的異常(包括若沒有該方法該線程不太可能拋出的已檢查的異常)。有關(guān)更多信息,請參閱為何 Thread.stop、Thread.suspend 和 Thread.resume 遭到反對?。void suspend()已過時。該方法已經(jīng)遭到反對,因?yàn)樗哂泄逃械乃梨i傾向。如果目標(biāo)線程掛起時在保護(hù)關(guān)鍵系統(tǒng)資源的監(jiān)視器上保持有鎖,則在目標(biāo)線程重新開始以前任何線程都不能訪問該資源。如果重新開始目標(biāo)線程的線程想在調(diào)用 resume 之前鎖定該監(jiān)視器,則會發(fā)生死鎖。這類死鎖通常會證明自己是“凍結(jié)”的進(jìn)程。有關(guān)更多信息,請參閱為何 Thread.stop、Thread.suspend 和 Thread.resume 遭到反對?。String toString()返回該線程的字符串表示形式,包括線程名稱、優(yōu)先級和線程組。static void yield()暫停當(dāng)前正在執(zhí)行的線程對象,并執(zhí)行其他線程。
六、線程的狀態(tài)轉(zhuǎn)換圖
線程在一定條件下,狀態(tài)會發(fā)生變化。線程變化的狀態(tài)轉(zhuǎn)換圖如下:
1、新建狀態(tài)(New):新創(chuàng)建了一個線程對象。
2、就緒狀態(tài)(Runnable):線程對象創(chuàng)建后,其他線程調(diào)用了該對象的start()方法。該狀態(tài)的線程位于可運(yùn)行線程池中,變得可運(yùn)行,等待獲取CPU的使用權(quán)。
3、運(yùn)行狀態(tài)(Running):就緒狀態(tài)的線程獲取了CPU,執(zhí)行程序代碼。
4、阻塞狀態(tài)(Blocked):阻塞狀態(tài)是線程因?yàn)槟撤N原因放棄CPU使用權(quán),暫時停止運(yùn)行。直到線程進(jìn)入就緒狀態(tài),才有機(jī)會轉(zhuǎn)到運(yùn)行狀態(tài)。阻塞的情況分三種:
(一)、等待阻塞:運(yùn)行的線程執(zhí)行wait()方法,JVM會把該線程放入等待池中。
(二)、同步阻塞:運(yùn)行的線程在獲取對象的同步鎖時,若該同步鎖被別的線程占用,則JVM會把該線程放入鎖池中。
(三)、其他阻塞:運(yùn)行的線程執(zhí)行sleep()或join()方法,或者發(fā)出了I/O請求時,JVM會把該線程置為阻塞狀態(tài)。當(dāng)sleep()狀態(tài)超時、join()等待線程終止或者超時、或者I/O處理完畢時,線程重新轉(zhuǎn)入就緒狀態(tài)。
5、死亡狀態(tài)(Dead):線程執(zhí)行完了或者因異常退出了run()方法,該線程結(jié)束生命周期。
七、線程的調(diào)度
1、調(diào)整線程優(yōu)先級:Java線程有優(yōu)先級,優(yōu)先級高的線程會獲得較多的運(yùn)行機(jī)會。
Java線程的優(yōu)先級用整數(shù)表示,取值范圍是1~10,Thread類有以下三個靜態(tài)常量: static int MAX_PRIORITY 線程可以具有的最高優(yōu)先級,取值為10。static int MIN_PRIORITY 線程可以具有的最低優(yōu)先級,取值為1。static int NORM_PRIORITY 分配給線程的默認(rèn)優(yōu)先級,取值為5。
Thread類的setPriority()和getPriority()方法分別用來設(shè)置和獲取線程的優(yōu)先級。
每個線程都有默認(rèn)的優(yōu)先級。主線程的默認(rèn)優(yōu)先級為Thread.NORM_PRIORITY。
線程的優(yōu)先級有繼承關(guān)系,比如A線程中創(chuàng)建了B線程,那么B將和A具有相同的優(yōu)先級。JVM提供了10個線程優(yōu)先級,但與常見的操作系統(tǒng)都不能很好的映射。如果希望程序能移植到各個操作系統(tǒng)中,應(yīng)該僅僅使用Thread類有以下三個靜態(tài)常量作為優(yōu)先級,這樣能保證同樣的優(yōu)先級采用了同樣的調(diào)度方式。
2、線程睡眠:Thread.sleep(long millis)方法,使線程轉(zhuǎn)到阻塞狀態(tài)。millis參數(shù)設(shè)定睡眠的時間,以毫秒為單位。當(dāng)睡眠結(jié)束后,就轉(zhuǎn)為就緒(Runnable)狀態(tài)。sleep()平臺移植性好。
3、線程等待:Object類中的wait()方法,導(dǎo)致當(dāng)前的線程等待,直到其他線程調(diào)用此對象的 notify()方法或 notifyAll()喚醒方法。這個兩個喚醒方法也是Object類中的方法,行為等價于調(diào)用 wait(0)一樣。
4、線程讓步:Thread.yield()方法,暫停當(dāng)前正在執(zhí)行的線程對象,把執(zhí)行機(jī)會讓給相同或者更高優(yōu)先級的線程。
5、線程加入:join()方法,等待其他線程終止。在當(dāng)前線程中調(diào)用另一個線程的join()方法,則當(dāng)前線程轉(zhuǎn)入阻塞狀態(tài),直到另一個進(jìn)程運(yùn)行結(jié)束,當(dāng)前線程再由阻塞轉(zhuǎn)為就緒狀態(tài)。
6、線程喚醒:Object類中的notify()方法,喚醒在此對象監(jiān)視器上等待的單個線程。如果所有線程都在此對象上等待,則會選擇喚醒其中一個線程。選擇是任意性的,并在對實(shí)現(xiàn)做出決定時發(fā)生。線程通過調(diào)用其中一個 wait 方法,在對象的監(jiān)視器上等待。直到當(dāng)前的線程放棄此對象上的鎖定,才能繼續(xù)執(zhí)行被喚醒的線程。被喚醒的線程將以常規(guī)方式與在該對象上主動同步的其他所有線程進(jìn)行競爭;例如,喚醒的線程在作為鎖定此對象的下一個線程方面沒有可靠的特權(quán)或劣勢。類似的方法還有一個notifyAll(),喚醒在此對象監(jiān)視器上等待的所有線程。注意:Thread中suspend()和resume()兩個方法在JDK1.5中已經(jīng)廢除,不再介紹。因?yàn)橛兴梨i傾向。
7、常見線程名詞解釋
主線程:JVM調(diào)用程序mian()所產(chǎn)生的線程。
當(dāng)前線程:這個是容易混淆的概念。一般指通過Thread.currentThread()來獲取的進(jìn)程。后臺線程:指為其他線程提供服務(wù)的線程,也稱為守護(hù)線程。JVM的垃圾回收線程就是一個后臺線程。
前臺線程:是指接受后臺線程服務(wù)的線程,其實(shí)前臺后臺線程是聯(lián)系在一起,就像傀儡和幕后操縱者一樣的關(guān)系??苁乔芭_線程、幕后操縱者是后臺線程。由前臺線程創(chuàng)建的線程默認(rèn)也是前臺線程??梢酝ㄟ^isDaemon()和setDaemon()方法來判斷和設(shè)置一個線程是否為后臺線程。
本文出自 “熔 巖” 博客,請務(wù)必保留此出處http://lavasoft.blog.51cto.com/62575/27069