SCJP總結_1

SCJP期末考試
個人感覺題目難度較低,但是也反映了許多我沒有掌握到、掌握好的東西。做完試卷後有時間我就慢慢把一些東西記到草紙上,一張不夠再問監考老師要一張,兩位老師發現我在做什麼後都覺得很有意思。其中的美女老師是我們上個學期的微機原理老師,那時候上她的我有時候就會冒出來回答問題爭取平時成績的。
進入正題。
1.    方法內的內部類僅能訪問封裝方法中的靜態方法嗎?
方法內的內部類可以訪問任何封裝類中定義的內容?
 
封裝方法中的靜態方法?
一般情況下方法內部是不允許再嵌套方法的,所以封裝方法中的**方法一說很有問題,可能是抄題筆誤。  方法內的內部類能夠訪問封裝類內定義的任何方法,包括私有的。即第二句是正確的。
2.Object 的 public int hashCode()
A. 沒有提供實現
B. 返回對象所包含的特定整數碼。
D. 返回JVM中關於Object類內在的固定數字
 
As much as is reasonably practical, the hashCode method defined by class Object does return distinct integers for distinct objects. (This is typically implemented by converting the internal address of the object into an integer, but this implementation technique is not required by the JavaTM programming language.)
 
3. 如果一個方法只定義了局部變量,那麼線程上下文切換出現問題?

??????????the answer is in the explaination about thread in the following.
4. 嘗試運行下面的代碼:
class MayBe{
       private String sayYes(boolean b){
              assert b:sayNo(b);
              return "Yes";
       }
       private String sayNo(boolean b){
              assert b:sayYes(b);
              return "No";
       }
       public static void main(String args[]){
              MayBe maybe=new MayBe();
              maybe.sayYes(false);
       }
}
 
系統斷言可用,編譯通過。
執行時,屏幕輸出:Exception in thread “main” java.lang.StackOverflowError
5. Thread 中常用方法有哪些?作用分別是什麼?
線程的生命週期?
public final void join()
                throws InterruptedException
Waits for this thread to die.
 
public void run()
If this thread was constructed using a separate Runnable run object, then that Runnable object's run method is called; otherwise, this method does nothing and returns.
Subclasses of Thread should override this method.
public final void stop()
Deprecated. This method is inherently unsafe. Stopping a thread with Thread.stop causes it to unlock all of the monitors that it has locked (as a natural consequence of the unchecked ThreadDeath exception propagating up the stack).
It is permitted to stop a thread that has not yet been started. If the thread is eventually started, it immediately terminates.
 
public static void sleep(long millis)
                  throws InterruptedException
Causes the currently executing thread to sleep (temporarily cease execution) for the specified number of milliseconds. The thread does not lose ownership of any monitors.
 
public void start()
Causes this thread to begin execution; the Java Virtual Machine calls the run method of this thread.
The result is that two threads are running concurrently: the current thread (which returns from the call to the start method) and the other thread (which executes its run method).
public final void suspend()
Deprecated. This method has been deprecated, as it is inherently deadlock-prone. If the target thread holds a lock on the monitor protecting a critical system resource when it is suspended, no thread can access this resource until the target thread is resumed. If the thread that would resume the target thread attempts to lock this monitor prior to calling resume, deadlock results. Such deadlocks typically manifest themselves as "frozen" processes.
If the thread is alive, it is suspended and makes no further progress unless and until it is resumed.
 
public static void yield()
Causes the currently executing thread object to temporarily pause and allow other threads to execute.
 
通過調用start()方法啓動縣城,執行run()方法。調用start()方法只是啓動線程,並不意味着線程可以立刻得到指向,這取決於線程獲取資源的情況和CUP的佔有情況。
通過調用setDaemon(Boolean)方法可以將一個線程設置爲後臺線程,該方法應在縣城啓動前調用,否則會拋出IllegalThreadStateException異常來。
 
l       守護線程是一類特殊的線程,它和普通線程的區別在於它並不是應用程序的核心部分,當一個應用程序的所有非守護線程終止運行時,即使仍然有守護線程在運行,應用程序也將終止,反之,只要有一個非守護線程在運行,應用程序就不會終止。守護線程一般被用於在後臺爲其它線程提供服務。
l       可以通過調用方法 isDaemon() 來判斷一個線程是否是守護線程,也可以調用方法 setDaemon() 來將一個線程設爲守護線程。
 
 
 
l       Java 提供了大量方法來支持阻塞,下面讓我們逐一分析。
n       1. sleep() 方法:sleep() 允許 指定以毫秒爲單位的一段時間作爲參數,它使得線程在指定的時間內進入阻塞狀態,不能得到CPU 時間,指定的時間一過,線程重新進入可執行狀態。典型地,sleep() 被用在等待某個資源就緒的情形:測試發現條件不滿足後,讓線程阻塞一段時間後重新測試,直到條件滿足爲止。
n        2. suspend() 和 resume() 方法:兩個方法配套使用,suspend()使得線程進入阻塞狀態,並且不會自動恢復,必須其對應的resume() 被調用,才能使得線程重新進入可執行狀態。典型地,suspend() 和 resume() 被用在等待另一個線程產生的結果的情形:測試發現結果還沒有產生後,讓線程阻塞,另一個線程產生了結果後,調用 resume() 使其恢復。
n       3. yield() 方法:yield() 使得線程放棄當前分得的 CPU 時間,但是不使線程阻塞,即線程仍處於可執行狀態,隨時可能再次分得 CPU 時間。調用 yield() 的效果等價於調度程序認爲該線程已執行了足夠的時間從而轉到另一個線程。
n       4. wait() 和 notify() 方法:兩個方法配套使用,wait() 使得線程進入阻塞狀態,它有兩種形式,一種允許 指定以毫秒爲單位的一段時間作爲參數,另一種沒有參數,前者當對應的 notify() 被調用或者超出指定時間時線程重新進入可執行狀態,後者則必須對應的 notify() 被調用。
l              初看起來它們與 suspend() 和 resume() 方法對沒有什麼分別,但是事實上它們是截然不同的。區別的核心在於,前面敘述的所有方法,阻塞時都不會釋放佔用的鎖(如果佔用了的話),而這一對方法則相反。
l              上述的核心區別導致了一系列的細節上的區別。
n       首先,前面敘述的所有方法都隸屬於 Thread 類,但是這一對卻直接隸屬於 Object 類,也就是說,所有對象都擁有這一對方法。初看起來這十分不可思議,但是實際上卻是很自然的,因爲這一對方法阻塞時要釋放佔用的鎖,而鎖是任何對象都具有的,調用任意對象的 wait() 方法導致線程阻塞,並且該對象上的鎖被釋放。 而調用 任意對象的notify()方法則導致因調用該對象的 wait() 方法而阻塞的線程中隨機選擇的一個解除阻塞(但要等到獲得鎖後才真正可執行)。 
n       其次,前面敘述的所有方法都可在任何位置調用,但是這一對方法卻必須在 synchronized 方法或塊中調用,理由也很簡單,只有在synchronized 方法或塊中當前線程才佔有鎖,纔有鎖可以釋放。
l       同樣的道理,調用這一對方法的對象上的鎖必須爲當前線程所擁有,這樣纔有鎖可以釋放。因此,這一對方法調用必須放置在這樣的 synchronized 方法或塊中該方法或塊的上鎖對象就是調用這一對方法的對象。若不滿足這一條件,則程序雖然仍能編譯,但在運行時會出現IllegalMonitorStateException 異常。
l       suspend() 方法和不指定超時期限的 wait() 方法的調用都可能產生死鎖。遺憾的是,Java 並不在語言級別上支持死鎖的避免,我們在編程中必須小心地避免死鎖。
l       wait() 和 notify() 方法的上述特性決定了它們經常和synchronized 方法或塊一起使用,將它們和操作系統的進程間通信機制作一個比較就會發現它們的相似性:synchronized方法或塊提供了類似於操作系統原語的功能,它們的執行不會受到多線程機制的干擾,而這一對方法則相當於 block 和wakeup 原語(這一對方法均聲明爲 synchronized)。
l       它們的結合使得我們可以實現操作系統上一系列精妙的進程間通信的算法(如信號量算法),並用於解決各種複雜的線程間通信問題。
l       關於 wait() 和 notify() 方法最後再說明兩點:
  第一:調用 notify() 方法導致解除阻塞的線程是從因調用該對象的 wait() 方法而阻塞的線程中隨機選取的,我們無法預料哪一個線程將會被選擇,所以編程時要特別小心,避免因這種不確定性而產生問題。
  第二:除了 notify(),還有一個方法 notifyAll() 也可起到類似作用,唯一的區別在於,調用 notifyAll() 方法將把因調用該對象的 wait() 方法而阻塞的所有線程一次性全部解除阻塞。當然,只有獲得鎖的那一個線程才能進入可執行狀態。
 
 
l       線程的三個部分
n       虛擬CPU
               線程或執行上下文,被認爲是帶有自己的程序代碼和數據的虛擬CPU的封裝。
n       代碼
n       數據
 
n       調用start()方法使線程所代表的虛擬CPU處於可運行狀態,這意味着它可以由JVM調度並執行。但並不意味着線程就會立即運行。
 
l       由於同一進程的多個線程共享同一片存儲空間,在帶來方便的同時,也帶來了訪問衝突這個嚴重的問題。Java語言提供了專門機制以解決這種衝突,有效避免了同一個數據對象被多個線程同時訪問。
 
l       在Java 技術中,每個對象都有一個和它相關聯的標誌。這個標誌可以被認爲是“鎖標誌”。
l        synchronized 關鍵字使能和這個標誌的交互,即允許獨佔地存取對象。
l       當線程運行到synchronized 語句,它檢查作爲參數傳遞的對象,並在繼續執行之前試圖從對象獲得鎖標誌。
l       當另一個線程試圖執行synchronized(this)語句時,它試圖從this 對象獲取鎖標誌。由於得不到標誌,所以線程不能繼續運行。然後,線程加入到與那個對象鎖相關聯的等待線程池中。當標誌返回給對象時,某個等待這個標誌的線程將得到這把鎖並繼續運行。
 
l       如果一個線程對同一個對象兩次發出synchronized 調用,則在跳出最外層的塊時,標誌會正確地釋放,而最內層的將被忽略。
l       對敏感數據的所有訪問都應該是 synchronized
l       synchronized 保護的敏感數據應該是 private
 
               只有當所有對敏感數據的存取位於同步塊內,synchronized()纔會發生作用。所有由synchronized 塊保護的敏感數據應當標記爲private。考慮來自對象的敏感部分的數據的可存取性。如果它們不被標記爲private,則它們可以由位於類定義之外的代碼存取。這樣,你必須確信其他程序員不會省略必需的保護。
 
l       synchronized 方法控制對類成員變量 synchronized 方法都必須獲得調用該方法的類實例的鎖方能執行,否則所屬線程阻塞,方法一旦執行,就獨佔該鎖,直到從該方法返回時纔將鎖釋放,此後被阻塞的線程方能獲得該鎖,重新進入可執行狀態。的訪問:每個類實例對應一把鎖,每個
l       這種機制確保了同一時刻對於每一個類實例,其所有聲明爲 synchronized 的成員函數中至多隻有一個處於可執行狀態(因爲至多隻有一個能夠獲得該類實例對應的鎖),從而有效避免了類成員變量的訪問衝突(只要所有可能訪問類成員變量的方法均被聲明爲 synchronized)。
l       在 Java 中,不光是類實例,每一個類也對應一把鎖,這樣我們也可將類的靜態成員函數聲明爲 synchronized ,以控制其對類的靜態成員變量的訪問。
 
 
cannot display the picture of thead states.....reffer to notebook
JAVA語言中的線程在整個生命週期中共有5種狀態。
A。 新建狀態  當一個線程實例被創建時,線程處於新建狀態,此時線程已經被初始化並分配了資源。
B。 就緒狀態  線程已經具備運行條件,進入線程隊列,排隊等待CPU,一旦獲得CPU使用權,就可進入運行狀態。
C。 運行狀態  當就緒狀態的線程被調度獲得CPU資源時,便進入運行狀態。定義在線程體中的run()方法被調用,從方法體第一條語句開始順序執行。
D。 阻塞狀態  處於運行狀態的線程因時間的發生,而導致讓出CUP使用權,並中止當前執行,進入阻塞狀態。處於阻塞狀態的縣城,只有當引起阻塞的原因被消除後,先必須轉入就緒狀態,纔可在獲取CPU使用權從原來中止處開始繼續執行。
E。 死亡狀態  線程死亡的原因有兩個,一個是正在正常運行的線程指向完全部工作,即執行完了run()方法,並正常退出;另一個是線程被提前強制中止,例如調用destroy()方法種植線程。處於死亡狀態的線程不能被重新啓動,即不具有繼續運行的能力。如果啓動一個處於死亡狀態的線程,則IllegalThreadStateException異常被拋出。
 
 
l       線程組是一個 Java 特有的概念,在 Java 中,線程組是類ThreadGroup 的對象,每個線程都隸屬於唯一一個線程組,這個線程組在線程創建時指定並在線程的整個生命期內都不能更改
l       你可以通過調用包含 ThreadGroup 類型參數的 Thread 類構造函數來指定線程屬的線程組,若沒有指定,則線程缺省地隸屬於名爲 system 的系統線程組。
l       在 Java 中,除了預建的系統線程組外,所有線程組都必須顯式創建。在 Java 中,除系統線程組外的每個線程組又隸屬於另一個線程組,你可以在創建線程組時指定其所隸屬的線程組,若沒有指定,則缺省地隸屬於系統線程組。這樣,所有線程組組成了一棵以系統線程組爲根的樹。
l       Java 允許我們對一個線程組中的所有線程同時進行操作,比如我們可以通過調用線程組的相應方法來設置其中所有線程的優先級,也可以啓動或阻塞其中的所有線程
l       Java 的線程組機制的另一個重要作用是線程安全。線程組機制允許我們通過分組來區分有不同安全特性的線程,對不同組的線程進行不同的處理,還可以通過線程組的分層結構來支持不對等安全措施的採用。
l       Java 的 ThreadGroup 類提供了大量的方法來方便我們對線程組樹中的每一個線程組以及線程組中的每一個線程進行操作。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章