多線程編程和網絡編程入門

1.進程和線程的區別
(1)進程:
資源管理的最小單位
獨立的內存空間
包含一個或多個線程
(2)線程:
程序執行的最小單位
擁有獨立的棧空間
(3)進程類(Process)
(4)線程體(Java的線程是通過java.lang.Thread類來實現的每個線程都是通過某個特定Thread對象所對應的方法run( )來完成其操作的,方法run( )稱爲線程體(即線程的可執行代碼))
(5)主線程
在任何Java程序啓動時,一個線程立刻運行(即mian方法對應的線程),該線程通常稱爲程序的主線程
主線程的特點 :
它是產生其他子線程的線程
它不一定是最後完成執行的線程,子線程可能在它結束之後還在運行

2.創建線程的兩種方式
(1)方式一:用Thread類創建線程
聲明爲一個 Thread 類的子類,並覆蓋 run() 方法
class MyThread extends Thread {
public void run( ) {
/* 覆蓋該方法*/
}
}
當使用繼承創建線程,這樣啓動線程:
new MyThread().start();

(2)方式二:使用Runnable接口創建多線程
聲明爲一個實現 Runnable 接口的類,並實現 run() 方法
class MyThread implements Runnable{
public void run() {
/* 實現該方法*/
}
}
當使用實現接口創建線程,這樣啓動線程:
new Thread(new MyThread()).start();

3.java.lang.Thread類的常用方法
(1)靜態方法
currentThread() 返回當前線程實例
sleep(long millis) 當前線程休眠
yield() 當前線程停頓
dumpStack() 打印當前線程的調用棧
(2)常用方法
start() 啓動該線程,將導致run方法被自動調用
run() 必須覆蓋該方法,在方法體中添加線程邏輯代碼
interrupt() 用於將一箇中斷請求發送給線程
interrupted() 用於測試當前線程是否已經被中斷
isInterrupted() 用於測試某個線程是否已經被中斷
isAlive() 用於測試某個線程是否還活着
setPriority(int newPriority) 設置線程的優先級
join( ) 等待線程結束
(3)兩種創建線程方法的比較
使用Runnable接口:
可以將代碼和數據分開,形成清晰的模型
還可以從其他類繼承
保持程序風格的一致性

直接繼承Thread類:
不能再從其他類繼承
編寫簡單,可以直接操縱線程
無需使用Thread. currentThread()

4.線程的四種狀態
(1)
這裏寫圖片描述

(2)守護線程:
守護線程是爲其它線程提供服務的線程,如定時器線程
守護線程一般應該是一個獨立的線程,它的run()方法是一個無限循環
守護線程與其它線程的區別是:如果守護線程是唯一運行着的線程,程序會自動退出
把線程變成一個守護線程:t .setDeamon(true);

(3)線程的調度
Java提供一個線程調度程序來監控程序中啓動後進入可運行狀態的所有線程
線程調度程序按照線程的優先級決定應調度哪些線程執行
多數線程的調度是搶佔式的
-時間片方式(time slicing)
-非時間片方式

下面幾種情況下,當前線程會放棄CPU
線程調用了yield()或sleep()方法主動放棄
由於當前線程進行I/O訪問,外存讀寫,等待用戶輸入等操作,導致線程阻塞
爲等候一個條件變量,線程調用wait()方法
搶先式系統下,有高優先級的線程參與調度;時間片方式下,當前時間片用完,有同優先級的線程參與調度

(4)線程的優先級
在java中,每一個線程都有一個優先級。默認情況下,一個線程將繼承其父線程的優先級。線程的優先級用數字來表示,範圍從1到10,一個線程的缺省優先級是5
Thread.MIN_PRIORITY = 1
Thread.MAX_PRIORITY = 10
Thread.NORM_PRIORITY = 5
使用下述線方法獲得或設置線程對象的優先級
int getPriority();
void setPriority(int newPriority);

5.同步和鎖
(1)同步:爲了確保在任何時刻一個共享對象只被一個線程使用,必須使用“同步(synchronized)”
有兩種方式實現同步:
使用同步方法
synchronized void methodA() { }
使用同步塊
synchronized(obj){//obj是被鎖定的對象
//要同步的語句
}

(2)同步原理:每個對象擁有自己的鎖,對於同一個鎖,不能有兩個線程同時訪問

(3)死鎖:當所有的線程都在等待得到某個資源後才能繼續運行下去時,整個程序將被掛起,這種情況就叫做死鎖

(4)多線程協作-wait和notify
wait
類似於sleep,當前線程休眠
釋放自己佔用的鎖(不同於sleep)
可以指定休眠的時間,也可不指定

notify/notifyAll
喚醒正在wait狀態等待當前鎖的線程
notifyAll喚醒所有wait狀態的線程
notify只喚醒一個wait狀態的線程

(5)interrupt 打斷線程的等待

6.ThreadLocal
用來爲每個線程保存一個變量
操作
初始化(使用泛型)
ThreadLocal counter= new ThreadLocal();
保存一個值
counter.set(1);
讀取一個值
int i=counter.get()
刪除保存的值
counter.remove();

7.URL及其操作類
(1)URL格式:
這裏寫圖片描述
URI是統一資源標識符,而URL是統一資源定位符。籠統地說,每個URL都是 URI,反之則不一定。這是因爲URI還包括一個子類,即統一資源名稱 (URN),它命名資源但不指定如何定位資源
爲了表示URL,java.net中實現了類URL。類URL的常見構造方法如下
URL urlBase=new URL(“http://www. 263.net/”)
URL net263=new URL (“http://www.263.net/“)
URL index263=new URL(net263, “index.html”)
new URL(“http”, “www.gamelan.com”, “/pages/Gamelan.net work.html”);

8.基於Java 自身技術實現消息方式系統通訊
在網絡協議上java 支持TCP/IP 和UDP/IP
在網絡IO 操作上java 支持BIO 和NIO
因此在java 中有四種方法可實現基於消息方式的系統間通訊
TCP/IP+BIO
TCP/IP+NIO
UDP/IP+BIO
UDP/IP+NIO

發佈了46 篇原創文章 · 獲贊 3 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章