4、多執行緒和網路程式設計
阿新 • • 發佈:2019-01-24
知識點:多執行緒與網路程式設計瞭解程序:程序是應用程式執行的例項,有獨立的記憶體空間和系統資源瞭解執行緒:執行緒是CPU排程和分派的基本單位,程序中執行運算的最小單位,真正在CPU上執行的是執行緒 共享資源使用Runnable物件建立執行緒時,多個執行緒共享Runnable的資源*一個程序裡可以有多個執行緒,但至少包含一個執行緒(主執行緒):Main(String[] args)方法是主執行緒**當一個類只建立執行緒時刻繼承Thread類**如果一個類既需要使建立執行緒又需要繼承某個類可以實現Runnable介面
1.1 執行緒的狀態執行緒的生命週期包括四個狀態:新生狀態(new)、可執行狀態(run)、阻塞狀態(wait)和死亡狀態(dead)新生狀態:new執行緒物件之後 ———— 執行start()方法之前可執行狀態:執行statr()方法之後 ———— 搶佔到資源之前阻塞狀態:執行狀態的執行緒遇到如:睡眠狀態(sleep()方法)時,等待I/O流執行結果時,其他執行緒佔用鎖時,通過方法等待時,suspend()和resume()方法(該方法是一個危險的方法,JDK以將其改為過期的方法)死亡狀態:run()方法退出時或遇到異常時停止,死亡狀態的狀態並不會立即釋放空間————————————————————————————————1.2 執行緒排程多個執行緒處於可執行狀態優先順序:反映執行緒的重要或緊急程度執行緒的優先順序用1~10表示,10的優先順序最高,預設值是5更改優先順序的方法setPriority(int grade)
————————————————————————————————1.3 Socket通訊鏈路的斷點就被稱為“套接字”(英文名Socket)是提供給引用程式的介面通過Socket發出請求或相應請求
- main()方法即為主執行緒入口
- 在一個時間只有一個執行緒在執行,採用搶佔資源的方式
- 執行緒分為兩種
- 系統級(核心級)執行緒
- 使用者級的執行緒
- 使用執行緒步驟:
- 定義執行緒
- 建立執行緒物件
- 啟動執行緒
- *如果直接呼叫thread()的無參構造建立執行緒物件,start()方法什麼都不會做
- 終止執行緒
/* * 方式一:繼承Thread類來建立執行緒 * 建立執行緒:輸出1-100之間的偶數 */ //1.繼承Thread類 public class TestThread extends Thread{ private int count = 0; //2.重寫Thread類的run()方法 public void run(){ while(count<100){ count++; if(count%2==0){ System.out.println("count="+count); } } } } //—————————————————————————————————————————————— /* * 啟動TestThread執行緒 */ public class TestThread2 { public static void main(String[] args) { //3.建立執行緒物件 TestThread mt = new TestThread(); //4.啟動執行緒(重點):呼叫start()方法 mt.start(); } }
/* * 方式二:實現Runnable介面來建立執行緒 * 建立執行緒::輸出1-100之間的偶數 */ //1.實現Runnable介面 public class TestThread implements Runnable{ private int count = 0; //2.實現Runnable介面的run()方法 public void run(){ while(count<100){ count++; if(count%2==0){ System.out.println("count="+count); } } } } //—————————————————————————————————————————————— /* * 啟動TestThread執行緒 */ public class TestThread2 { public static void main(String[] args) { //3.建立執行緒物件 TestThread tt = new TestThread(); Thread thread = new Thread(tt); //4.啟動執行緒(重點):呼叫start()方法 thread.start(); } }
1.1 執行緒的狀態執行緒的生命週期包括四個狀態:新生狀態(new)、可執行狀態(run)、阻塞狀態(wait)和死亡狀態(dead)新生狀態:new執行緒物件之後 ———— 執行start()方法之前可執行狀態:執行statr()方法之後 ———— 搶佔到資源之前阻塞狀態:執行狀態的執行緒遇到如:睡眠狀態(sleep()方法)時,等待I/O流執行結果時,其他執行緒佔用鎖時,通過方法等待時,suspend()和resume()方法(該方法是一個危險的方法,JDK以將其改為過期的方法)死亡狀態:run()方法退出時或遇到異常時停止,死亡狀態的狀態並不會立即釋放空間————————————————————————————————1.2 執行緒排程多個執行緒處於可執行狀態優先順序:反映執行緒的重要或緊急程度執行緒的優先順序用1~10表示,10的優先順序最高,預設值是5更改優先順序的方法setPriority(int grade)
//更改執行緒的優先順序:取值範圍1~10
myThread.setPriority(3);
執行緒排程的方法joid():將制定的執行緒加入到當前執行緒sleep():將當前執行緒阻塞制定的毫秒數//繼承Thread類
public class Mythread extends Thread{
//重寫Thread類run方法:列印1~5
public void run(){
for(int i = 1; i <= 5; i++){
System.out.println(this.getName()+":"+i);
}
}
}
//——————————————————————————————————————————————
//測試類:測試執行緒,測試join()方法
public class Test {
public static void main(String[] args) {
//for迴圈列印1~10
for(int i = 1; i <= 10; i++){
//如果i==5則建立Mythread物件執行啟動執行緒
if(i==5){
//建立執行緒物件
Mythread mt = new Mythread();
//啟動執行緒
mt.start();
//捕獲異常
try {
//讓main阻塞:優先執行mt執行緒
mt.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//Thread.currentThread()方法:返回當前執行的執行緒物件
System.out.println(Thread.currentThread().getName()+":"+i);
}
}
}
執行結果://測試類:測試sleep()方法
public class Test {
public static void main(String[] args) {
//列印一句話
System.out.println("wait");
//捕獲異常
try {
//休眠5000毫秒(5秒)
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//列印第二句話
System.out.println("contionue");
}
}
————————————————————————————————1.3 Socket通訊鏈路的斷點就被稱為“套接字”(英文名Socket)是提供給引用程式的介面通過Socket發出請求或相應請求
- 埠:計算機上一些整形數字來表現,每一種服務開啟一個Socket,對應一個埠
- 1-1023被系統佔用
- MySQL:預設埠3306
- Oracle:預設埠1523
- Socket分類:
- 流式套接字(SOCK_STREAM)
- 面向連線、可靠的資料傳輸服務:基於TCP協議
- 基於TCP協議的Socket網路通訊
- 用來實現雙向安全連線網路通訊
- 基於TCP協議的Socket網路通訊
- 面向連線、可靠的資料傳輸服務:基於TCP協議
- 流式套接字(SOCK_STREAM)
- Socket通訊模型
- 進行網路通訊時,Socket需要藉助資料流來完成資料的傳遞工作
- Socket通訊模型
- **基於TCP協議使用java.net包下的Socket&ServerSocket
- 在編寫程式時因有連線,故先寫伺服器後寫客戶端
- 資料報式套接字(SOCK_DGRAM)
- 無連線服務:基於UDP協議
- 資料報式套接字(SOCK_DGRAM)
- 原始式套接字(SOCK_RAW)
- TCP協議與UDP協議
TCP | UDP | |
是否連線 | 面向連線 | 面向非連線 |
傳輸可靠性 | 可靠 | 不可靠 |
速度 | 慢 | 快 |
- java.net包
- Socket
- ServerSocket
- DatagramPacket
- DatagramSocket
- InetAddress