Java是一種可以撰寫跨平臺應(yīng)用軟件的面向?qū)ο蟮某绦蛟O(shè)計(jì)語言。Java 技術(shù)具有卓越的通用性焦读、高效性子库、平臺移植性和安全性,廣泛應(yīng)用于PC矗晃、數(shù)據(jù)中心仑嗅、游戲控制臺、科學(xué)超級計(jì)算機(jī)张症、移動電話和互聯(lián)網(wǎng)仓技,同時(shí)擁有全球最大的開發(fā)者專業(yè)社群。
給你學(xué)習(xí)路線:html-css-js-jq-javase-數(shù)據(jù)庫-jsp-servlet-Struts2-hibernate-mybatis-spring4-springmvc-ssh-ssm
多線程有幾種實(shí)現(xiàn)方案俗他,分別是哪幾種???
三種脖捻。
繼承Thread類
實(shí)現(xiàn)Runnable接口:Java不支持類的多重繼承,但允許你調(diào)用多個(gè)接口兆衅。所以如果你要繼承其他類地沮,當(dāng)然是調(diào)用Runnable接口好了。
實(shí)現(xiàn)Callable接口羡亩。這個(gè)得和線程池結(jié)合摩疑。
線程與進(jìn)程的區(qū)別???
線程是進(jìn)程的子集,一個(gè)進(jìn)程可以有很多線程畏铆,每條線程并行執(zhí)行不同的任務(wù)雷袋。
不同的進(jìn)程使用不同的內(nèi)存空間,而所有的線程共享一片相同的內(nèi)存空間及志。別把它和棧內(nèi)存搞混片排,每個(gè)線程都擁有單獨(dú)的棧內(nèi)存用來存儲本地?cái)?shù)據(jù)
什么是線程池? 為什么要使用它???
創(chuàng)建線程要花費(fèi)昂貴的資源和時(shí)間速侈,如果任務(wù)來了才創(chuàng)建線程那么響應(yīng)時(shí)間會變長率寡,而且一個(gè)進(jìn)程能創(chuàng)建的線程數(shù)有限。為了避免這些問題倚搬,在程序啟動的時(shí)候就創(chuàng)建若干線程來響應(yīng)處理冶共,它們被稱為線程池,里面的線程叫工作線程。從JDK1.5開始捅僵,Java API提供了Executor框架讓你可以創(chuàng)建不同的線程池家卖。比如單線程池,每次處理一個(gè)任務(wù)庙楚;數(shù)目固定的線程池或者是緩存線程池(一個(gè)適合很多生存期短的任務(wù)的程序的可擴(kuò)展線程池)上荡。
同步有幾種方式,分別是什么???
兩種馒闷。
同步代碼塊:
小編推薦一個(gè)學(xué)Java的學(xué)習(xí)裙【 六五零酪捡,五五四,六零七 】纳账,無論你是大牛還是小白逛薇,是想轉(zhuǎn)行還是想入行都可以來了解一起進(jìn)步一起學(xué)習(xí)!裙內(nèi)有開發(fā)工具疏虫,很多干貨和技術(shù)資料分享永罚!
同步代碼塊
同步方法:
同步方法
啟動一個(gè)線程是run()還是start()?它們的區(qū)別???
啟動線程用?start();
run():?封裝了被線程執(zhí)行的代碼,直接調(diào)用僅僅是普通方法的調(diào)用
start():?啟動線程,并由JVM自動調(diào)用run()方法
注:start()方法被用來啟動新創(chuàng)建的線程卧秘,而且start()內(nèi)部調(diào)用了run()方法呢袱,這和直接調(diào)用run()方法的效果不一樣。當(dāng)你調(diào)用run()方法的時(shí)候翅敌,只會是在原來的線程中調(diào)用产捞,沒有新的線程啟動,start()方法才會啟動新線程哼御。
sleep()和wait()方法的區(qū)別???
sleep():?必須指時(shí)間; 不釋放鎖。
wait():?可以不指定時(shí)間焊唬,也可以指定時(shí)間; 釋放鎖恋昼。
小編推薦一個(gè)學(xué)Java的學(xué)習(xí)裙【 六五零,五五四赶促,六零七 】液肌,無論你是大牛還是小白,是想轉(zhuǎn)行還是想入行都可以來了解一起進(jìn)步一起學(xué)習(xí)鸥滨!裙內(nèi)有開發(fā)工具嗦哆,很多干貨和技術(shù)資料分享!
區(qū)別比較
為什么wait(),notify(),notifyAll()等方法都定義在Object類中???
因?yàn)檫@些方法的調(diào)用是依賴于鎖對象的婿滓,而同步代碼塊的鎖對象是任意鎖老速。
而Object代碼任意的對象,所以凸主,定義在這里面橘券。
線程的生命周期???
新建(new):處于該狀態(tài)的時(shí)間很短暫。已被分配了必須的系統(tǒng)資源,并執(zhí)行了初始化旁舰。表示有資格獲得CPU時(shí)間锋华。調(diào)度器可以把該線程變?yōu)閞unnable或者blocked狀態(tài)
就緒(Runnable):這種狀態(tài)下只要調(diào)度器把時(shí)間片分配給線程,線程就能運(yùn)行箭窜。處在這種狀態(tài)就是可運(yùn)行可不運(yùn)行的狀態(tài)
阻塞(Bolocked):線程能夠運(yùn)行毯焕,但有個(gè)條件阻止它的運(yùn)行。當(dāng)線程處于阻塞狀態(tài)時(shí)磺樱,調(diào)度器將會忽略線程纳猫,不會分配給線程任何CPU時(shí)間(例如sleep)。只有重新進(jìn)入了就緒狀態(tài)坊罢,才有可能執(zhí)行操作续担。
死亡(Dead):處于死亡狀態(tài)的線程講不再是可調(diào)度的,并且再也不會得到CPU時(shí)間活孩。任務(wù)死亡的通常方式是從run()方法返回物遇。
一個(gè)任務(wù)進(jìn)入阻塞狀態(tài),可能有如下原因:
1.sleep
2.wait()憾儒,知道線程得到了notify()或者notifyAll()消息询兴,線程才會進(jìn)入就緒狀態(tài)。
3.任務(wù)在等待某個(gè)輸入/輸出完成
4.線程在試圖在某個(gè)對象上調(diào)用其同步控制方法起趾,但是對象鎖不可用诗舰,因?yàn)榱硪粋€(gè)任務(wù)已經(jīng)獲取了這個(gè)鎖。
線程生命周期圖解
如何避免死鎖???
Java多線程中的死鎖
死鎖是指兩個(gè)或兩個(gè)以上的進(jìn)程在執(zhí)行過程中训裆,因爭奪資源而造成的一種互相等待的現(xiàn)象眶根,若無外力作用,它們都將無法推進(jìn)下去边琉。這是一個(gè)嚴(yán)重的問題属百,因?yàn)樗梨i會讓你的程序掛起無法完成任務(wù),死鎖的發(fā)生必須滿足以下四個(gè)條件:
小編推薦一個(gè)學(xué)Java的學(xué)習(xí)裙【 六五零变姨,五五四族扰,六零七 】,無論你是大牛還是小白定欧,是想轉(zhuǎn)行還是想入行都可以來了解一起進(jìn)步一起學(xué)習(xí)渔呵!裙內(nèi)有開發(fā)工具,很多干貨和技術(shù)資料分享砍鸠!
死鎖發(fā)生的四個(gè)條件
避免死鎖最簡單的方法就是阻止循環(huán)等待條件扩氢,將系統(tǒng)中所有的資源設(shè)置標(biāo)志位、排序爷辱,規(guī)定所有的進(jìn)程申請資源必須以一定的順序(升序或降序)做操作來避免死鎖类茂。