java 关于线程
線程 又稱"執行上下文"
線程有起點,終點,順序,但不能單獨運行,依賴于程序
有兩種方法可以創建多線程的類
(1)派生Thread類的子類,Thread類在java.lang中定義
(2)實現Runnable接口,該接口中有一個run方法.Runnable接口也是在java.lang中定義
第二種方法主要用于要編寫多線程的類需要從其它類中派生,出于java不能支持類的多繼續的特性來考慮.
有關線程的幾個重要概念:線程體,線程狀態,ThreadGroup類
線程體:
線程體在run()方法中編寫.
可以通過重要Thread中的run()方法或者實現Runnable接口中的Run方法.
線程的狀態:
線程有四個狀態
(1)新線程態
使用new運算符創建了一個Thread,并且在未調用start()方法之前
此時,線程只是空的對象,系統未分配任何系統資源.
可用stop()把新線程變為死亡態
(2)可運行態
調用了start(),線程進入可運行態.
此時,線程獲得了必要的系統資源,并調用已經實現的run()方法.
此時,線程處于就緒狀態,只等待處理器就可以運行了
(3)不可運行態
當調用了suspend()[掛起]方法,sleep()方法,用wait()方法等候一個條件變量或被IO阻塞,線程就可以從運行態變為不可運行態.
要重返可運行態,必須消除原來的不可運行原因:
suspend()掛起的線程再調用resume()[重新開始,恢復]
sleep()時間已經結束
等候的條件變量的擁有對象調用了notify()或notifyAll()方法
(4)死亡態
線程可以自然死亡,如它的run()方法正常退出運行.
也可以被殺死,調用stop()方法.該方法將拋出一個ThreadDeath對象給線程,線程接收到對象后才死亡.
Thread有一個isAlive()方法.當線程處理第二第三種狀態時,返回true,另外兩種返回false.
線程優先級
固定優先級調用,選擇各可運行態的線程中優先級別最高的先運行,同級線程則排隊執行.
新進入可運行態的線程若優先級高也可搶先獲得運行權.
線程默認的優先級是繼承創建它的線程而來的,可調用實現了Thread類的setPriority()方法修改.
一個線程調用yield()方法可以放棄CPU,但當其它的優先級別都比本線程低時,該方法無效.
Daemon[守護進程,后臺程序]線程
該線程為同一進程中的其他線程或對象提供服務.
要定義一個線程為Daemon線程,要調用setDaemon(true)方法,可以通過isDaemon()方法來判斷一個線程是否為Daemon.
線程組
由java.lang中的ThreadGroup類來實現
提供一種機制將多個線程收集成一個對象,在組中一齊處理.如調用一個方法掛起所有組中的線程
要加入某個線程組,需要在創建線程時的構造方法中進行指定.
未指明線程組的,默認放在創建它的線程的同一組中,即當前線程組.
對應于應用程序application,其當前線程組是一個叫main的線程組.
通過getThreadGroup()方法可以查明當前所屬線程組
?
太晚了,未完待續...
?
ThreadGroup類
ThreadGroup中可以包含其它的ThreadGroup類,形成樹狀結構.
它提供一組方法管理一列線程,其它對象可以訪問線程列表.
activeCount()可以獲得組中的線程數.
enumerate()方法可以枚舉組中的線程和其他線程組.
ThreadGroup類中有一些方法允許修改組中所有線程的當前狀態.如resume(),stop(),suspend().這些方法會改變組中每個線程和子組中所有線程的狀態.
同步與鎖定
java語言從最基本的Object類開如就提供也實現線程同步的機制,如有notify(),notifyAll(),wait()這三個方法,它與通過調用synchronized方法進行監視,鎖定對象,保證同一時刻只有一個線程可以取用這個對象(資源)
監視器:
多個線程異步地執行,試圖同時訪問一個對象,因些出現錯結果,這種叫競爭條件問題.
監視器結合條件變量和鎖定數據的功能,并鎖的線程進行監視器之后呢,其它線程不能進入,直到被鎖的線程退出監視器.
程序中能使并行線程訪問共同數據對象的代碼段稱為關鍵部分,用synchronized關鍵字進行標記.
標記在方法上,該方法被稱了同步方法,其鎖定的是一個對象.
如果該方法是一靜態方法,則鎖定的是一個類.
一個同步方法對應有一個監視器,當一對象調用一同步方法時,就要先獲得監視器,然后給對象加上鎖,否則,只是等待鎖被釋放.
wait()方法:
已知該方法讓當前線程進入不可運行態,等待某種條件的改變,線程將持續等待到其它線程調用notify()和notifyAll()方法來通知它.
當線程調用wait時,會自動釋放監視器,當退出等待狀態時,重新獲得監視器.
notify()和notifyAll()方法:
notify()喚醒一個調用了當前對象的wait()方法而進入等待狀態的線程,但并喚醒的線程并沒有馬上運行,它必須等到時當前線程退出sysnchronized塊,釋放了對象鎖之后,被喚醒的線程才能有機會獲得鎖并開始運行.
關于同步與鎖定的一般使用形式如下:
public class Test {public synchronized void go(){while(條件!=true)wait();邏輯處理;notify();} } ? 死鎖(DeadLock): 當發生死鎖時,可以向一個線程拋出一個ThreadDeath對象殺死該進程. 調用wait()后,會釋放監視器,讓其它線程獲得運行機會,避免死鎖.轉載于:https://www.cnblogs.com/laizhd/archive/2011/08/14/2137674.html
總結
- 上一篇: Python自然语言处理学习笔记(32)
- 下一篇: .NET连接SAP系统专题:C#获取RF