• 招生咨詢熱線:4008-569-579 
  • 手機(jī)版
    用手機(jī)掃描二維碼直達(dá)商品手機(jī)版
招生咨詢熱線
4008-569-579
機(jī)構(gòu)主頁 > 培訓(xùn)資料 > 每一個(gè)java程序員都應(yīng)該具備的java編程思想
機(jī)構(gòu)主頁 > 培訓(xùn)資料>每一個(gè)java程序員都應(yīng)該具備的java編程思想

每一個(gè)java程序員都應(yīng)該具備的java編程思想

來源:廣州達(dá)內(nèi)教育        時(shí)間:2023-05-30        熱度:134℃        返回列表

         java編程思想是每一個(gè)想要學(xué)習(xí)java語言或者是已經(jīng)從事java語言相關(guān)工作的人都應(yīng)該要具備的思想,java編程思想就是讓所有的事物在任何的時(shí)刻只能用一個(gè)執(zhí)行步驟去執(zhí)行任務(wù),并發(fā)編程,程序可以并行的執(zhí)行程序中的多個(gè)任務(wù)。那么每一個(gè)java程序員都應(yīng)該具備的java編程思想是怎么樣的呢?下面達(dá)內(nèi)科技java培訓(xùn)班的講師就給大家來科普下:

  1 、定義任務(wù)


  線程可以驅(qū)動(dòng)任務(wù),因此你需要一種描述任務(wù)的方式,這可以由Runnable接口來提供。要想定義任務(wù),只需實(shí)現(xiàn)Runnable接口并編寫run()方法,使得該任務(wù)可以執(zhí)行你的命令。


  當(dāng)從Runnable導(dǎo)出一個(gè)類時(shí),它必須具有run()方法,但是這個(gè)方法并無特殊之處——它不會(huì)產(chǎn)生任何內(nèi)在的線程能力。要實(shí)現(xiàn)線程行為,你必須顯式地將一個(gè)任務(wù)附著到線程上。


  2、 使用Executor


  FixedThreadPool 與 CachedThreadPool


  FixedThreadPool, 可以一次性預(yù)先執(zhí)行代價(jià)高昂的線程分配,因而也就可以限制線程的數(shù)量了。這可以節(jié)省時(shí)間,因?yàn)槟悴挥脼槊總€(gè)任務(wù)都固定地付出創(chuàng)建線程的開銷。在事件驅(qū)動(dòng)的系統(tǒng)中,需要線程的事件處理器,通過直接從池中獲取線程,也可以如你所愿地得到服務(wù)。你不會(huì)濫用可獲得的資源,因?yàn)镕ixedThreadPool使用的Thread對(duì)象的數(shù)量是有界的。


  3 、從任務(wù)中產(chǎn)生返回值


  Runnable是執(zhí)行工作的獨(dú)立任務(wù),但是它不返回任務(wù)值。如果你希望任務(wù)在完成時(shí)能夠返回一個(gè)值,那么可以實(shí)現(xiàn)Callable接口而不是Runnable接口。在Java SE5中引入的Callable是一種具有類型參數(shù)的泛型,它的類型參數(shù)表示的是從方法call()(而不是run())中返回的值,并且必須使用ExecutorService.submit()方法調(diào)用它。


  4、 編碼的變體


  另一種可能會(huì)看到的慣用法是自管理的Runnable。


  這與從Thread繼承并沒有什么特別的差異,只是語法稍微晦澀一些。但是,實(shí)現(xiàn)接口使得你可以繼承另一個(gè)不同的類,而從Thread繼承將不行。


  5、 線程組


  線程組持有一個(gè)線程集合。線程組的價(jià)值可以引用Joshua Bloch的話來總結(jié):“把線程組看成是一次不成功的嘗試,你只要忽略它就好了。”


  6 、捕獲異常


  由于線程的本質(zhì)特性,使得你不能捕獲從線程中逃逸的異常。一旦異常逃出任務(wù)的run()方法,它就會(huì)向外傳播到控制臺(tái),除非你采取特殊的步驟捕獲這種錯(cuò)誤的異常。


  7、 共享受限資源


  可以把單線程程序當(dāng)作在問題域求解的單一實(shí)體,每次只能做一件事情。


  8、 不正確地訪問資源


  因?yàn)閏anceled標(biāo)志是boolean類型的,所以它是原子性的,即諸如賦值和返回值這樣的簡單操作在發(fā)生時(shí)沒有中斷的可能,因此你不會(huì)看到這個(gè)域處于在執(zhí)行這些簡單操作的過程中的中間狀態(tài)。


  有一點(diǎn)很重要,那就是要注意到遞增程序自身也需要多個(gè)步驟,并且在遞增過程中任務(wù)可能會(huì)被純種機(jī)制掛起——也就是說,在Java中,遞增不是原子性的操作。因此,如果不保護(hù)任務(wù),即使單一的遞增也不是安全的。


  9、線程之間的協(xié)作


  wait()與notifyAll()


  wait()使你可以等待某個(gè)條件發(fā)生變化,而改變這個(gè)條件超出了當(dāng)前方法的控制能力。通常,這種條件將由另一個(gè)任務(wù)來改變。你肯定不想在你的任務(wù)測試這個(gè)條件的同時(shí),不斷地進(jìn)行空循環(huán),這被稱為忙等待, 通常是一種不良的周期使用方式。因此wait()會(huì)在等等外部世界產(chǎn)生變化的時(shí)候?qū)⑷蝿?wù)掛起,并且只有在notify()或notifyAll() 發(fā)生時(shí),即表示發(fā)生了某些感興趣的事物,這個(gè)任務(wù)才會(huì)被喚醒并去檢查所產(chǎn)生的變化。因此,wait()提供了一種在任務(wù)之間對(duì)活動(dòng)同步的方式。


  調(diào)用sleep()的時(shí)候鎖并沒有被 釋放,調(diào)用yield()也屬于這種情況,理解這一點(diǎn)很重要。


  wait(), notify()以及notifyAll()有一個(gè)比較特殊的方面,那就是這些方法是基類Object的一個(gè)部分,而不是屬于Thread的一部分。


  錯(cuò)失的信號(hào)。


  notify() 與 notifyAll()


  在有關(guān)Java的線程機(jī)制的討論中,有一個(gè)令人困惑的描述: notifyAll()將喚醒“所有下在等等的任務(wù)”。這是否意味著在程序中任何地方,任何處于wait()狀態(tài)中的任務(wù)都將被任何對(duì)notifyAll()的調(diào)用喚醒呢?有示例說明情況并非如此——事實(shí)上,當(dāng)notifyAll()因某個(gè)特定鎖而被調(diào)用時(shí),只有等待這個(gè)鎖的任務(wù)才會(huì)被喚醒。


  總結(jié)


  線程的一個(gè)額外好處是它們提供了輕量級(jí)的執(zhí)行上下文切換(大約100條指令),而不是重量級(jí)的進(jìn)程上下文切換(要上千條指令)。因?yàn)橐粋€(gè)給定進(jìn)程內(nèi)的所有線程共享相同的內(nèi)存空間,輕量級(jí)的上下文切換只是改變了程序的執(zhí)行序列和局部變量。進(jìn)程切換(重量級(jí)的上下文切換)必須改變所有內(nèi)存空間。


  以上就是達(dá)內(nèi)科技的小編給大家整理的關(guān)于java編程思想的內(nèi)容,每一個(gè)程序員都應(yīng)該要具備好的編程思想。只有你有完整的編程思想,那么在以后的工作中才不會(huì)在遇到問題的時(shí)候手忙腳亂。如果說你想要學(xué)習(xí)java語言的話,那么可以點(diǎn)擊我們文章下面的獲取試聽資格按鈕來獲取我們的java培訓(xùn)免費(fèi)課程試聽資格,來和我們的講師進(jìn)行面對(duì)面的交流和溝通并更加深入的了解我們達(dá)內(nèi)科技。

電話咨詢

電話咨詢

咨詢電話:
4008-569-579
回到頂部

回到頂部