1. 程式人生 > >JavaSE基礎(day19)(1)I/O流(2)執行緒的基本概念和基本操作(3)執行緒的同步機制

JavaSE基礎(day19)(1)I/O流(2)執行緒的基本概念和基本操作(3)執行緒的同步機制

默寫:
1.程式設計題
使用三種方式實現檔案的拷貝。

程式碼
(1)I/O流
(2)執行緒的基本概念和基本操作
(3)執行緒的同步機制

1.I/O流
1.1 ObjectOutputStream類(重點)
(1)基本概念
java.io.ObjectOutputStream類用於將物件整體寫入到輸出流中。
只能將支援 java.io.Serializable 介面的物件寫入流中。
類通過實現 java.io.Serializable 介面以啟用其序列化(將一個物件中的所有內容轉換為位元組序列的過程)功能。

(2)常用的方法
ObjectOutputStream(OutputStream out) - 根據引數指定的引用來構造物件。
- 其中OutputStream型別是個抽象類,實參需要傳遞子類的物件。
void writeObject(Object obj)
- 用於將引數指定的物件整體寫入到輸出流中。
void close()

1.2 ObjectInputStream類(重點)
(1)基本概念
java.io.ObjectInputStream類用於從輸入流中整體讀取一個物件。

(2)常用的方法
ObjectInputStream(InputStream in) - 根據引數指定的引用來構造物件。
- 其中InputStream類是個抽象類,實參需要傳遞子類的物件。
Object readObject() - 用於讀取一個物件並返回。
- 無法根據返回值來判斷是否讀取到檔案的末尾。
void close()

經驗:
當需要向檔案中寫入多個物件時,通常建議將這些物件先放入到一個集合中,將整個集合看做一個整體寫入檔案中,此時讀取檔案中的資料只需要呼叫一次readObject()方法就可以讀出所有內容。

2.執行緒的基本概念和基本操作
2.1 基本概念
程式 - 主要指存放在硬碟/磁碟上的可執行檔案。
程序 - 主要指執行在記憶體中的程式。

目前主流的作業系統都支援多程序,為了同時執行多個任務,程序是重量級的,新建程序對系統的資源消耗比較大,因此程序的數量還是有限的。
執行緒就是指程序內部的程式流,是輕量級的,新建執行緒會共享所在程序的資源,因此對系統的資源消耗比較小,以後開發中採用多執行緒技術是主流的方式。
目前主流的作業系統都是採用時間片輪轉法來保證多個任務的併發執行效果,所謂的併發就是指巨集觀並行微觀序列。

2.2 執行緒的建立(重中之重)
(1)使用Thread類建立執行緒
java.lang.Thread類用於描述執行緒,Java虛擬機器允許應用程式併發地執行多個執行執行緒 建立並啟動執行緒的方式有兩種:
a.自定義類繼承Thread類並重寫run()方法,然後建立物件呼叫start()方法。
b.自定義類實現Runnable介面並重寫run()方法,建立物件作為構造Thread類物件
的實參來呼叫start()方法。

(2)Thread類的方法
Thread() - 使用無參的方式構造物件。
Thread(Runnable target) - 根據引數指定的介面引用來構造物件。
- 實參可以傳遞實現類的物件,或者使用匿名內部類。
Thread(String name) - 根據引數指定的名稱來構造物件。
Thread(Runnable target, String name) - 引數指定介面引用和名稱。

void run() - 若使用Runnable介面作為引數構造的執行緒物件,則最終呼叫介面中的run()方法;否則該方法啥也不做直接返回。
void start() - 啟動執行緒並自動呼叫run()方法。

(3)原理分析
執行main()方法的執行緒叫做主執行緒,執行run()方法的執行緒叫做新執行緒/子執行緒。
對於start()方法之前的程式碼來說,只會被主執行緒執行一次,當start()方法呼叫成功後,執行緒的個數瞬間由1個變成了2個,其中新創建出來的執行緒去執行run()方法,原來執行main()方法的主執行緒繼續向下執行,兩個執行緒各自獨立執行。
當run()方法結束時,則子執行緒結束;當main()方法結束時,則主執行緒結束。
主執行緒和子執行緒之間沒有明確的執行先後次序,由系統的排程演算法來決定。

2.3 執行緒的名稱和編號(熟悉)
String getName() - 用於獲取執行緒的名稱。
void setName(String name) - 用於設定執行緒的名稱為引數指定的數值。
long getId() - 用於獲取執行緒的編號。
static Thread currentThread() - 用於返回當前正在執行的執行緒物件的引用。

2.4 執行緒的主要狀態(熟悉)
新建狀態 - 當使用new關鍵字建立完執行緒物件之後的狀態。
- 此時執行緒並沒有開始執行。
就緒狀態 - 呼叫start()方法之後進入的狀態。
- 此時執行緒依然沒有開始執行。
執行狀態 - 當執行緒排程器排程該執行緒之後進入的狀態。
- 此時執行緒正式開始執行。
- 若時間片執行結束但任務沒有做完就回到就緒狀態。
消亡狀態 - 當時間片執行結束並且任務已經完成時進入的狀態。
- 此時執行緒已經終止了。
阻塞狀態 - 當執行緒執行的過程中發生了阻塞事件進入的狀態,如:sleep()方法。
- 當阻塞狀態解除後進入就緒狀態而不是執行狀態。

視訊
javaseday19-作業講解-01
https://v.qq.com/txp/iframe/player.html?vid=x0798xmknao
javaseday19-物件流的概念和使用-02
https://v.qq.com/txp/iframe/player.html?vid=f079861xi6d
javaseday19-執行緒的基本概念-03
https://v.qq.com/txp/iframe/player.html?vid=t0798332gnr
javaseday19-執行緒的建立和啟動-04
https://v.qq.com/txp/iframe/player.html?vid=r0798eje4xt
javaseday19-執行緒編號和名稱以及主要狀態-05
https://v.qq.com/txp/iframe/player.html?vid=m0798bxu8ig

程式碼
https://pan.baidu.com/s/1i7gM7XiEF47BP8SImQLxRw

作業:
1.思考:
建立和啟動執行緒兩種方式之間的區別是什麼?
2.使用繼承的方式啟動一個子執行緒,在子執行緒中列印每隔1秒列印一句話“紙上談來
終覺淺,絕知此事要躬行!”,總共列印10次。
要求主執行緒等待5秒後列印“等不住你了,再見!”。
3.要求在學生資訊管理系統中增加兩個功能:
a.要求啟動該專案時,先讀取檔案中的所有學生資訊。
b.要求退出該專案時,將所有的學生資訊寫入到檔案中。