以下內容整理自:http://blog.csdn.net/wtyvhreal/article/details/44176369 線程:是指進程中的一個執(zhí)行流程,。 線程與進程的區(qū)別:每個進程都需要操作系統(tǒng)為其分配獨立的內存地址空間,,而同一進程中的所有線程在同一塊地址空間中工作,,這些線程可以共享同一塊內存和系統(tǒng)資源。 Java實現多線程的方法有兩種,,一是繼承Thread類,、二是實現Runnable接口。
一,、繼承Thread類 public class ThreadTest extends Thread { @Override public void run() { System.out.println("this thread name is:"+Thread.currentThread().getName()); } /** * @param args */ public static void main(String[] args) { ThreadTest t = new ThreadTest(); t.setName("myTestThread"); t.start(); } }
二,、實現Runnable接口 public class RunnableTest implements Runnable { @Override public void run() { System.out.println("this thread name is:"+Thread.currentThread().getName()); } public static void main(String[] args) { System.out.println(Thread.currentThread().getName()); RunnableTest r = new RunnableTest(); Thread t = new Thread(r); t.start(); } }
三、線程的狀態(tài)轉換
四,、線程同步各個方法的區(qū)別
五,、線程池 多線程技術主要解決處理器單元內多個線程執(zhí)行的問題,它可以顯著減少處理器單元的閑置時間,,增加處理器單元的吞吐能力,。 假設一個服務器完成一項任務所需時間為:T1 創(chuàng)建線程時間,,T2 在線程中執(zhí)行任務的時間,T3 銷毀線程時間,。
1,、線程池管理器(ThreadPool):用于創(chuàng)建并管理線程池,包括 創(chuàng)建線程池,,銷毀線程池,,添加新任務; 2,、工作線程(PoolWorker):線程池中線程,,在沒有任務時處于等待狀態(tài),可以循環(huán)的執(zhí)行任務,; 3,、任務接口(Task):每個任務必須實現的接口,以供工作線程調度任務的執(zhí)行,,它規(guī)定了任務的入口,,任務執(zhí)行完后的收尾工作,,任務的執(zhí)行狀態(tài)等,; 4、任務隊列(taskQueue):用于存放沒有處理的任務,。提供一種緩沖機制,。 線程池技術關注如何縮短或調整T1,T3時間的技術,從而提高服務器程序性能,。它把T1,,T3分別安排在服務器程序的啟動和結束的時間段或者一些空閑的時間段,這樣在服務器程序處理客戶請求時,,不會有T1,,T3的開銷了。線程池不僅調整T1,T3產生的時間段,,而且它還顯著減少了創(chuàng)建線程的數目,,看一個例子: 1,、 調整各個線程的優(yōu)先級 2、 讓處于運行狀態(tài)的線程調用Thread.sleep()方法 3,、 讓處于運行狀態(tài)的線程調用Thread.yield()方法 4,、 讓處于運行狀態(tài)的線程調用另一個線程的join()方法 調整各個線程的優(yōu)先級 Thread類的setPriority(int)和getPriority()方法分別用來設置優(yōu)先級和讀取優(yōu)先級。 如果希望程序能夠移值到各個操作系統(tǒng)中,,應該確保在設置線程的優(yōu)先級時,,只使用MAX_PRIORITY、NORM_PRIORITY,、MIN_PRIORITY這3個優(yōu)先級,。 線程讓步:當線程在運行中執(zhí)行了Thread類的yield()靜態(tài)方法時,如果此時具有相同優(yōu)先級的其它線程處于就緒狀態(tài),,那么yield()方法將把當前運行的線程放到運行池中并使另一個線程運行,。如果沒有相同優(yōu)先級的可運行線程,則yield()方法什么也不做,。 Sleep()方法和yield()方法都是Thread類的靜態(tài)方法,,都會使當前處于運行狀態(tài)的線程放棄CPU,把運行機會讓給別的線程,,兩者的區(qū)別在于:1,、sleep()方法會給其他線程運行的機會,而不考慮其他線程的優(yōu)先級,,因此會給較低線程一個運行的機會,;yield()方法只會給相同優(yōu)先級或者更高優(yōu)先級的線程一個運行的機會。 2,、當線程執(zhí)行了sleep(long millis)方法后,,將轉到阻塞狀態(tài),,參數millis指定睡眠時間;當線程執(zhí)行了yield()方法后,,將轉到就緒狀態(tài),。 3、sleep()方法聲明拋出InterruptedException異常,,而yield()方法沒有聲明拋出任何異常 4,、sleep()方法比yield()方法具有更好的移植性 1,、如果一個同步代碼塊和非同步代碼塊同時操作共享資源,,仍然會造成對共享資源的競爭。因為當一個線程執(zhí)行一個對象的同步代碼塊時,,其他的線程仍然可以執(zhí)行對象的非同步代碼塊,。(所謂的線程之間保持同步,是指不同的線程在執(zhí)行同一個對象的同步代碼塊時,,因為要獲得對象的同步鎖而互相牽制) 2,、 每個對象都有唯一的同步鎖 3、 在靜態(tài)方法前面可以使用synchronized修飾符,。 4,、 當一個線程開始執(zhí)行同步代碼塊時,并不意味著必須以不間斷的方式運行,,進入同步代碼塊的線程可以執(zhí)行Thread.sleep()或者執(zhí)行Thread.yield()方法,,此時它并不釋放對象鎖,只是把運行的機會讓給其他的線程,。 5,、 Synchronized聲明不會被繼承,如果一個用synchronized修飾的方法被子類覆蓋,,那么子類中這個方法不在保持同步,,除非用synchronized修飾。 1、 這個類的對象可以同時被多個線程安全的訪問,。 2,、 每個線程都能正常的執(zhí)行原子操作,得到正確的結果,。 3,、 在每個線程的原子操作都完成后,對象處于邏輯上合理的狀態(tài),。 1,、 執(zhí)行完同步代碼塊就會釋放對象的鎖 2、 在執(zhí)行同步代碼塊的過程中,,遇到異常而導致線程終止,,鎖也會被釋放 3、 在執(zhí)行同步代碼塊的過程中,,執(zhí)行了鎖所屬對象的wait()方法,,這個線程會釋放對象鎖,進入對象的等待池,。 |
|