1. 程式人生 > >4、多執行緒和網路程式設計

4、多執行緒和網路程式設計

知識點:多執行緒與網路程式設計瞭解程序:程序是應用程式執行的例項,有獨立的記憶體空間和系統資源瞭解執行緒:執行緒是CPU排程和分派的基本單位,程序中執行運算的最小單位,真正在CPU上執行的是執行緒
  • main()方法即為主執行緒入口
  • 在一個時間只有一個執行緒在執行,採用搶佔資源的方式
  • 執行緒分為兩種
    • 系統級(核心級)執行緒
    • 使用者級的執行緒
  • 使用執行緒步驟:
  • 定義執行緒
  • 建立執行緒物件
  • 啟動執行緒
    • *如果直接呼叫thread()的無參構造建立執行緒物件,start()方法什麼都不會做
  • 終止執行緒
在Java中建立執行緒的兩種方式繼承Java.lang.Thread類不共享資源實現Java.lang.Runnable介面
共享資源使用Runnable物件建立執行緒時,多個執行緒共享Runnable的資源*一個程序裡可以有多個執行緒,但至少包含一個執行緒(主執行緒):Main(String[] args)方法是主執行緒**當一個類只建立執行緒時刻繼承Thread類**如果一個類既需要使建立執行緒又需要繼承某個類可以實現Runnable介面
/*
 * 方式一:繼承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的底層機制複雜,Java平臺提供了一些簡單的API,可以更簡單有效的使用Socket開發而無需瞭解底層機制
  • Socket分類:
    • 流式套接字(SOCK_STREAM)
      • 面向連線、可靠的資料傳輸服務:基於TCP協議
        • 基於TCP協議的Socket網路通訊
          • 用來實現雙向安全連線網路通訊
    • Socket通訊模型
      • 進行網路通訊時,Socket需要藉助資料流來完成資料的傳遞工作
  • **基於TCP協議使用java.net包下的Socket&ServerSocket
  • 在編寫程式時因有連線,故先寫伺服器後寫客戶端
    • 資料報式套接字(SOCK_DGRAM)
      • 無連線服務:基於UDP協議
**基於UDP協議使用java.net包下的:在編寫程式時因無連線,故先寫伺服器與客戶端都可以DatagramPacket 物件封裝資料包DatagramSocket 傳送資料包DatagramSocket 接收資料包DatagramPacket 處理資料包
    • 原始式套接字(SOCK_RAW)
  • TCP協議與UDP協議
TCPUDP
是否連線面向連線面向非連線
傳輸可靠性可靠不可靠
速度
  • java.net包
    • Socket
    • ServerSocket
    • DatagramPacket
    • DatagramSocket
    • InetAddress
————————————————————————————————1.3 多執行緒實現多請求1.採用多執行緒的方法2.一個專門負責監聽的應用主服務程式3.一個專門負責處理請求的執行緒程式伺服器:一直監聽客戶請求,一旦監聽到有客戶請求,理科建立一個執行緒,開啟執行緒執行緒:接收客戶請求,給予客戶一個相應(之前伺服器做的事)執行緒構造方法中去繫結客戶端的Socket客戶端:傳送請求到伺服器接收伺服器的相應InetAddress:獲得客戶端的IP