程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> [學習筆記]Thinking in Java (the 2nd edition) Study Note (4)

[學習筆記]Thinking in Java (the 2nd edition) Study Note (4)

編輯:關於JAVA

第13章 創建窗口和程序片

第14章 多線程

多線程的實現基本可以有2種方法:從Thread類繼承 和 實現Runnable 接口

1.從線程繼承為創建一個線程,最簡單的方法就是從Thread類繼承。這個類包含了創建和運行線程所需的一切東西。Thread最重要的方法是run()。但為了使用run(),必須對其進行過載或者覆蓋,使其能充分按自己的吩咐行事。因此,run()屬於那些會與程序中的其他線程“並發”或“同時”執行的代碼。雖然重載的是run() ,但在運行線程的時候,需要調用的是start() 方法;見下面的例子:

public class SimpleThread extends Thread { private int countDown = 10000; private int threadNumber; private static int threadCount = 0; public SimpleThread() { threadNumber = ++threadCount; System.out.println("Making " + threadNumber); } public void run() { while(true) { System.out.println("Thread " + threadNumber + "(" + countDown + ")"); if(--countDown == 0) return; } } public static void main(String[] args) { for(int i = 0; i < 5; i++) new SimpleThread().start(); System.out.println("All Threads Started"); }}

run()方法幾乎肯定含有某種形式的循環——它們會一直持續到線程不再需要為止。因此,我們必須規定特定的條件,以便中斷並退出這個循環(或者在上述的例子中,簡單地從run()返回即可)。run()通常采用一種無限循環的形式。也就是說,通過阻止外部發出對線程的stop()或者destroy()調用,它會永遠運行下去(直到程序完成)。

【共享有限的資源】可將單線程程序想象成一種孤立的實體,它能遍歷我們的問題空間,而且一次只能做一件事情。由於只有一個實體,所以永遠不必擔心會有兩個實體同時試圖使用相同的資源,就象兩個人同時都想停到一個車位,同時都想通過一扇門,甚至同時發話。進入多線程環境後,它們則再也不是孤立的。可能會有兩個甚至更多的線程試圖同時同一個有限的資源。必須對這種潛在資源沖突進行預防,否則就可能發生兩個線程同時訪問一個銀行帳號,打印到同一台計算機,以及對同一個值進行調整等等。

【一個線程可以有四種狀態】(1)新(New):線程對象已經創建,但尚未啟動,所以不可運行。(2)可運行(Runnable):意味著一旦時間分片機制有空閒的CPU周期提供給一個線程,那個線程便可立即開始運行。因此,線程可能在、也可能不在運行當中,但一旦條件許可,沒有什麼能阻止它的運行——它既沒有“死”掉,也未被“堵塞”。(3)死(Dead):從自己的run()方法中返回後,一個線程便已“死”掉。亦可調用stop()令其死掉,但會產生一個違例——屬於Error的一個子類(也就是說,我們通常不捕獲它)。記住一個違例的“擲”出應當是一個特殊事件,而不是正常程序運行的一部分。所以不建議你使用stop()(在Java1.2則是堅決反對)。另外還有一個destroy()方法(它永遠不會實現),應該盡可能地避免調用它,因為它非常武斷,根本不會解除對象的鎖定。(4)堵塞(Blocked):線程可以運行,但有某種東西阻礙了它。若線程處於堵塞狀態,調度機制可以簡單地跳過它,不給它分配任何CPU時間。除非線程再次進入“可運行”狀態,否則不會采取任何操作。

【為何會堵塞】堵塞狀態是前述四種狀態中最有趣的,值得我們作進一步的探討。線程被堵塞可能是由下述五方面的原因造成的:(1) 調用sleep(毫秒數),使線程進入“睡眠”狀態。在規定的時間內,這個線程是不會運行的。(2) 用suspend()暫停了線程的執行。除非線程收到resume()消息,否則不會返回“可運行”狀態。(3)用wait()暫停了線程的執行。除非線程收到nofify()或者notifyAll()消息,否則不會變成“可運行”(是的,這看起來同原因2非常相象,但有一個明顯的區別是我們馬上要揭示的)。(4) 線程正在等候一些IO(輸入輸出)操作完成。(5) 線程試圖調用另一個對象的“同步”方法,但那個對象處於鎖定狀態,暫時無法使用。

2.實現Runnable 接口

第15章 網絡編程1. 機器標識IP以兩種形式存在著:(1)大家最熟悉的DNS(域名服務)形式(2)由點號(.)分隔的四組數字,比如202.98.32.1112.網絡最基本的精神就是讓兩台機器連接到一起,並相互“交談”或者“溝通”。3.端口我們設置一個客戶機或者服務器的時候,必須選擇一個無論客戶機還是服務器都認可連接的端口。就象我們去拜會某人時,IP地址是他居住的房子,而端口是他在的那個房間。4.套接字“套接字”或者“插座”(Socket)也是一種軟件形式的抽象,用於表達兩台機器間一個連接的“終端”。針對一個特定的連接,每台機器上都有一個“套接字”,可以想象它們之間有一條虛擬的“線纜”。線纜的每一端都插入一個“套接字”或者“插座”裡。當然,機器之間的物理性硬件以及電纜連接都是完全未知的。抽象的基本宗旨是讓我們盡可能不必知道那些細節

第16章 設計模式范式分類《Design Patterns》 一書討論了23種不同的范式,並依據三個標准分類(所有標准都涉及那些可能發生變化的方面)。這三個標准是:(1) 創建:對象的創建方式。這通常涉及對象創建細節的隔離,這樣便不必依賴具體類型的對象,所以在新添一種對象類型時也不必改動代碼。(2) 結構:設計對象,滿足特定的項目限制。這涉及對象與其他對象的連接方式,以保證系統內的改變不會影響到這些連接。(3) 行為:對程序中特定類型的行動進行操縱的對象。這要求我們將希望采取的操作封裝起來,比如解釋一種語言、實現一個請求、在一個序列中遍歷(就象在繼承器中那樣)或者實現一種算法。本章提供了“觀察器”(Observer)和“訪問器”(Visitor)的范式的例子。

第17章 項目//略2005-4-5

--------------------------------------------------------------

總算可以告一段落了,前前後後花了3個多月才看完,有些許收獲,但更重要的是缺乏實踐的機會;下一步呢?下一步該干什麼?

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved