java編程思想是每一個想要學(xué)習(xí)java語言或者是已經(jīng)從事java語言相關(guān)工作的人都應(yīng)該要具備的思想,java編程思想就是讓所有的事物在任何的時刻只能用一個執(zhí)行步驟去執(zhí)行任務(wù),并發(fā)編程,程序可以并行的執(zhí)行程序中的多個任務(wù)。那么每一個java程序員都應(yīng)該具備的java編程思想是怎么樣的呢?下面達內(nèi)科技java培訓(xùn)班的講師就給大家來科普下:
1 、定義任務(wù)
線程可以驅(qū)動任務(wù),因此你需要一種描述任務(wù)的方式,這可以由Runnable接口來提供。要想定義任務(wù),只需實現(xiàn)Runnable接口并編寫run()方法,使得該任務(wù)可以執(zhí)行你的命令。
當(dāng)從Runnable導(dǎo)出一個類時,它必須具有run()方法,但是這個方法并無特殊之處——它不會產(chǎn)生任何內(nèi)在的線程能力。要實現(xiàn)線程行為,你必須顯式地將一個任務(wù)附著到線程上。
2、 使用Executor
FixedThreadPool 與 CachedThreadPool
FixedThreadPool, 可以一次性預(yù)先執(zhí)行代價高昂的線程分配,因而也就可以限制線程的數(shù)量了。這可以節(jié)省時間,因為你不用為每個任務(wù)都固定地付出創(chuàng)建線程的開銷。在事件驅(qū)動的系統(tǒng)中,需要線程的事件處理器,通過直接從池中獲取線程,也可以如你所愿地得到服務(wù)。你不會濫用可獲得的資源,因為FixedThreadPool使用的Thread對象的數(shù)量是有界的。
3 、從任務(wù)中產(chǎn)生返回值
Runnable是執(zhí)行工作的獨立任務(wù),但是它不返回任務(wù)值。如果你希望任務(wù)在完成時能夠返回一個值,那么可以實現(xiàn)Callable接口而不是Runnable接口。在Java SE5中引入的Callable是一種具有類型參數(shù)的泛型,它的類型參數(shù)表示的是從方法call()(而不是run())中返回的值,并且必須使用ExecutorService.submit()方法調(diào)用它。
4、 編碼的變體
另一種可能會看到的慣用法是自管理的Runnable。
這與從Thread繼承并沒有什么特別的差異,只是語法稍微晦澀一些。但是,實現(xiàn)接口使得你可以繼承另一個不同的類,而從Thread繼承將不行。
5、 線程組
線程組持有一個線程集合。線程組的價值可以引用Joshua Bloch的話來總結(jié):“把線程組看成是一次不成功的嘗試,你只要忽略它就好了?!?br>
6 、捕獲異常
由于線程的本質(zhì)特性,使得你不能捕獲從線程中逃逸的異常。一旦異常逃出任務(wù)的run()方法,它就會向外傳播到控制臺,除非你采取特殊的步驟捕獲這種錯誤的異常。
7、 共享受限資源
可以把單線程程序當(dāng)作在問題域求解的單一實體,每次只能做一件事情。
8、 不正確地訪問資源
因為canceled標(biāo)志是boolean類型的,所以它是原子性的,即諸如賦值和返回值這樣的簡單操作在發(fā)生時沒有中斷的可能,因此你不會看到這個域處于在執(zhí)行這些簡單操作的過程中的中間狀態(tài)。
有一點很重要,那就是要注意到遞增程序自身也需要多個步驟,并且在遞增過程中任務(wù)可能會被純種機制掛起——也就是說,在Java中,遞增不是原子性的操作。因此,如果不保護任務(wù),即使單一的遞增也不是安全的。
9、線程之間的協(xié)作
wait()與notifyAll()
wait()使你可以等待某個條件發(fā)生變化,而改變這個條件超出了當(dāng)前方法的控制能力。通常,這種條件將由另一個任務(wù)來改變。你肯定不想在你的任務(wù)測試這個條件的同時,不斷地進行空循環(huán),這被稱為忙等待, 通常是一種不良的周期使用方式。因此wait()會在等等外部世界產(chǎn)生變化的時候?qū)⑷蝿?wù)掛起,并且只有在notify()或notifyAll() 發(fā)生時,即表示發(fā)生了某些感興趣的事物,這個任務(wù)才會被喚醒并去檢查所產(chǎn)生的變化。因此,wait()提供了一種在任務(wù)之間對活動同步的方式。
調(diào)用sleep()的時候鎖并沒有被 釋放,調(diào)用yield()也屬于這種情況,理解這一點很重要。
wait(), notify()以及notifyAll()有一個比較特殊的方面,那就是這些方法是基類Object的一個部分,而不是屬于Thread的一部分。
錯失的信號。
notify() 與 notifyAll()
在有關(guān)Java的線程機制的討論中,有一個令人困惑的描述: notifyAll()將喚醒“所有下在等等的任務(wù)”。這是否意味著在程序中任何地方,任何處于wait()狀態(tài)中的任務(wù)都將被任何對notifyAll()的調(diào)用喚醒呢?有示例說明情況并非如此——事實上,當(dāng)notifyAll()因某個特定鎖而被調(diào)用時,只有等待這個鎖的任務(wù)才會被喚醒。
總結(jié)
線程的一個額外好處是它們提供了輕量級的執(zhí)行上下文切換(大約100條指令),而不是重量級的進程上下文切換(要上千條指令)。因為一個給定進程內(nèi)的所有線程共享相同的內(nèi)存空間,輕量級的上下文切換只是改變了程序的執(zhí)行序列和局部變量。進程切換(重量級的上下文切換)必須改變所有內(nèi)存空間。
以上就是達內(nèi)科技的小編給大家整理的關(guān)于java編程思想的內(nèi)容,每一個程序員都應(yīng)該要具備好的編程思想。只有你有完整的編程思想,那么在以后的工作中才不會在遇到問題的時候手忙腳亂。如果說你想要學(xué)習(xí)java語言的話,那么可以點擊我們文章下面的獲取試聽資格按鈕來獲取我們的java培訓(xùn)免費課程試聽資格,來和我們的講師進行面對面的交流和溝通并更加深入的了解我們達內(nèi)科技。