多線程
1.多線程的概述: 進程有多條執(zhí)行路徑,合稱為多線程.
進程:可執(zhí)行文件(程序).eg:exe文件
線程:進程的執(zhí)行路徑(執(zhí)行單元)
2.多線程并行和并發(fā)的區(qū)別
并行:
多個線程同時執(zhí)行.(前提是:需要多核CPU)
并發(fā):
多個線程同時請求執(zhí)行,但是同一瞬間,cpu只能執(zhí)行一個線程,于是安排這些線程交替執(zhí)行,由于時間間隔非常短,所以我們看起來是同一時間執(zhí)行的,其實并不是
3.多線程的實現(xiàn)方式
3.1繼承Thread類
步驟:
1.定義一個類(MyThread),繼承Thread類
2.重寫run()方法
3.把要執(zhí)行的代碼放入run方法中
4.創(chuàng)建線程對象
MyThread mt = new MyThread();
5.開啟線程
mt.start();
注意:
1) 開啟線程, 調(diào)用的是Thread#start()方法.
如果你調(diào)用的是run()方法, 那么只是普通的方法調(diào)用.
2) 同一個線程對象不能重復開啟, 否則會報: IllegalThreadStateException(非法的線程狀態(tài)異常)
3.2實現(xiàn)Runnable接口
1.定義一個實現(xiàn)類(MyRunnable),實現(xiàn)Runnable接口
2.重寫run()方法
3.把要執(zhí)行的代碼放入run()方法中
4.創(chuàng)建Runnable接口的子類對象,將其作為參數(shù)傳入Thread類的構造方法中,創(chuàng)建線程對象
MyRunnable mr = new MyRunnable();
Thread tr = new Thread(mr);
5.開啟線程
tr.start();
注意:
1) 開啟線程, 調(diào)用的是Thread#start()方法.
如果你調(diào)用的是run()方法, 那么只是普通的方法調(diào)用.
2) 同一個線程對象不能重復開啟, 否則會報: IllegalThreadStateException(非法的線程狀態(tài)異常)
模擬買票案例:
public class MyRunnable implements Runnable{
//定義變量,接收票數(shù)
private static int tickets = 100;
//重寫run()方法
@Override
public void run() {
while (true){
synchronized (this){ //加鎖,解決負數(shù)票以及重復票,鎖對象必須是同一把鎖,一般是本類的.class
//本方法使用實現(xiàn)Runnable接口,可以使用this,因為只創(chuàng)建了一個本類對象
//如果使用繼承Thread類方法實現(xiàn),不能使用this,需使用.class
if(tickets<1){
break;
}
System.out.println(Thread.currentThread().getName()+"正在出售第"+ tickets-- + "張票!");
}
}
}
}
//測試類
public class TestRunnable {
public static void main(String[] args) {
MyRunnable mr = new MyRunnable();
Thread th1 = new Thread(mr,"一號窗口");
Thread th2 = new Thread(mr,"二號窗口");
Thread th3 = new Thread(mr,"三號窗口");
Thread th4 = new Thread(mr,"四號窗口");
th1.start();
th2.start();
th3.start();
th4.start();
}
}
4.Thread類中的成員總結
構造方法:
public Thread();
public Thread(String name);
public Thread(Runnable target);
public Thread(Runnable target, String name);
成員方法:
public void run(); //里邊記錄的是多線程要執(zhí)行的代碼, 該方法會自動被start()方法調(diào)用.
public void start(); //開啟線程, 該方法會自動調(diào)用run().
public String getName(); //獲取當前正在執(zhí)行的線程對象的名字.
public void setName(String name); //設置線程名
public static Thread currentThread(); //獲取當前正在執(zhí)行的線程對象.
public static void sleep(long millis); //讓線程休眠指定的時間, 單位是: 毫秒.
網(wǎng)絡編程
1.概述:用來實現(xiàn)網(wǎng)絡互聯(lián)的,不同計算機上,運行的程序間,可以進行數(shù)據(jù)交互.
大白話講就是:用來在不同的設備之間進行數(shù)據(jù)傳輸?shù)?
網(wǎng)絡編程也叫套接字編程,也叫Socket編程
網(wǎng)絡模型(TCP/IP模型,7層):
物理層
數(shù)據(jù)鏈路層
傳輸層
網(wǎng)絡層
表示層
會話層
應用層
網(wǎng)絡編程的三大要素:
1.IP:設備在網(wǎng)絡中的唯一標識
2.端口:程序在設備上的唯一標識
3.協(xié)議:設備之間的通信規(guī)則
UDP: //群發(fā)消息.
1. 面向無連接.
2. 采用數(shù)據(jù)報包(DatagramPacket)發(fā)送數(shù)據(jù), 每個包的大小不能超過: 64KB.
3. 不安全(不可靠)協(xié)議.
4. 效率相對較高.
5. 不區(qū)分客戶端和服務器端, 叫發(fā)送端和接收端.
TCP: //單聊
1. 面向有連接(三次握手).
2. 采用IO流發(fā)送數(shù)據(jù), 理論上來講,無數(shù)據(jù)大小限制.
3. 安全(可靠)協(xié)議.
4. 效率相對較低.
5. 區(qū)分客戶端和服務器端.
網(wǎng)絡通信的原理:
網(wǎng)絡通信也叫Socket通信, 通信兩端都獨有自己的Socket對象, 數(shù)據(jù)在兩個Socket之間進行交互.
//例如: 你給你的朋友打電話, 看起來好像是你和你朋友在聊天, 其實是兩個手機在輸出數(shù)據(jù).
面試題:
1. 多線程并行和多線程并發(fā)的區(qū)別?
2. Java程序是多線程的嗎?
是, 至少開啟了 main線程(主線程), GC(垃圾回收線程).
3. 線程的默認命名規(guī)則是什么?
Thread-編號, 編號從0開始.
4. 多線程執(zhí)行的特點是什么?
隨機性, 延遲性. 原因是因為CPU在做著高效的切換.
5. 多線程的兩種實現(xiàn)方式的區(qū)別是什么?
繼承Thread類:
好處: 代碼相對比較簡單. //因為是繼承Thread類, 所以可以直接使用Thread類中的方法.
弊端: 擴展性相對較差. //因為已經(jīng)繼承Thread類了, 就不能繼承別的類.
實現(xiàn)Runnable接口:
好處: 擴展性相對較強.
弊端: 代碼相對比較繁瑣.
//繁瑣, 冗余, 復雜, 困難.
6. 多線程的生命周期是什么?
官方解釋:
新建, 就緒, 運行(可能會發(fā)生阻塞), 死亡.
加強版:
新建, 就緒, 運行(可能會發(fā)生阻塞和等待), 死亡.
7. 網(wǎng)絡編程的三大要素是什么?
8. 端口號的范圍是多少?
0--65535,其中0~1024之間的端口號已經(jīng)被系統(tǒng)占用了, 或者用作保留端口.
9. UDP協(xié)議和TCP協(xié)議的區(qū)別是什么?