程序設計的目標
性能:高性能的程序應該能夠等同於CPU的利用率,CPU的利用率越高(一直在工做,沒有閒下來的時候),程序的性能越高。
體驗:這裏的體驗不僅是界面多麼漂亮,功能多麼順手,這裏的體驗指程序的響應速度,響應速度越快,用戶體驗越好。
Socket網絡編程
在同一個JVM運行環境中,類與類之間能夠直接相互調用,可是處於不一樣的JVM中的類,它們之間是沒法直接調用的,這時經過Socket網絡編程可讓處於不一樣JVM、甚至不一樣計算機的類之間進行通信。
Socket:至關於電話座機
IP:至關於電話號碼
Socket的API經常使用方法:
accept()--阻塞;
getInputStream()--獲取網絡鏈接輸入流
getOutputStream()-- 獲取網絡鏈接輸出流編程
單線程多任務IO阻塞(例如:磁盤操做)時CPU空閒---解決方案:[單線程多任務異步IO --讓準備好的任務優先執行]
單線程多任務,有耗時計算 即CPU計算耗時阻塞----解決方案:[多線程程序(可進行任務執行切換)]
多CPU執行效果更好,但決定如何分配難,也就是多核下的線程同步與互斥
進程:在操做系統中運行着的一個獨立的程序(桌子)
線程:一個進程中一條獨立的執行分支。(一我的)
多線程與多進程:
一羣人(多個線程)在一個桌子(進程)上吃飯,他們會涉及到一些問題,好比多我的可能會夾一個菜(競爭),A和B同時看到盤子裏面有一塊肉,同時伸出筷子去夾,A先夾走,B遲了一點伸到盤子的時候已經沒了,只能縮回來(臨界資源,互斥),有一個點心須要用饃夾肉一塊兒吃。A夾了肉,B夾了饃,A須要B的饃,B須要A的肉,他們僵持不下誰都不讓步(死鎖)。 網絡
多線程之間的資源共享是很是方便的,由於他們共用進程的資源空間(在一個桌子上),可是須要注意一系列的問題,競爭,死鎖,同步等。若是在旁邊再開一個桌子(進程)。 那麼桌子之間講話,遞東西又不方便(進程間通訊),而開一個桌子的開銷比在一個桌子上多加一我的的開銷要大。另一個桌子上的人數不可能無限制增長,桌子的容量有限也坐不下這麼多人(進程的線程句柄是有限制的)。一個桌子壞了不會影響到另外一個桌子上面人的就餐狀況(進程間相互DuLi,一個進程崩潰不會影響另外一個),而一個桌子上的某人喝掛了須要送醫院,估計這一桌人都要散了(線程掛掉會致使整個進程也掛掉)。因此多線程與多進程是各有優缺點,不能一律而論。
總結
單線程程序:適合IO異步,不能阻塞,不能有大量耗CPU的計算。典型如Nodejs,還有一些網絡程序
多線程程序:適合CPU密集型程序
*多線程執行沒有一個肯定的順序,並非先啓動的線程必定先執行,當前一刻誰搶佔了CPU資源,誰就先執行。
*主線程只是負責啓動一條線程,並不須要等待該縣城運行結束,若是主線程調用的是run方法而不是start方法,那麼就僅僅使普通調用,這樣僅僅是單線程程序
*同一條線程不能啓動屢次。
如何經過Runnable接口實現多線程
一、因爲Runnable中沒有start(),因此啓動線程依然要調用Thread類中的start();多線程