?? java(day14).txt
字號:
CoreJava Day14
14.1 多線程的通信
■ 因為線程的死鎖,從而引發要多線程的通信
死鎖:每個線程不釋放自己擁有的資源,卻申請別的線程擁有的資源,會造成死鎖問題
■ 線程間的通信:等待通知機制
■ 每一個對象都有一個等待隊列。
線程t1對O調用wait方法,△必須是在對O加鎖的同步代碼塊中。
結果:1、線程t1會釋放它擁有的所有的鎖標記
2、會進入O的等待隊列,開始阻塞
線程t2對o調用notify/notifyAll方法時,也必須是在對o加鎖的同步代碼塊中。結果:會從o的等待隊列中釋放一個/全部線程
■
▲ 初始狀態 ▲阻塞狀態 ▲終止狀態
\ / ┍ 1 ┓
\ / \ 2sleep /
\start / \ 3join /stop
\ / \ /
┙ ┕ \ /
▲ 可運行狀態 _ _ _ OS選中 _ _ _\ ▲運行狀態
(只缺CPU) \ CPU到期或調用yield
┍ / \
\ / \wait
\ Synchronized/ \
\ / \
\ / \
\ / \
\ ┕ ┙
▲ 鎖池狀態 <------ ▲等待隊列
notify/notifyall
練習
1、利用線程的通信機制,用兩個線程打印以下的結果:
1 2 A 3 4 B 5 6 C 7 8 D ... 49 50 Y 51 52 Z
2、思考為什么調用wait()方法之前用while判斷,而不用if判斷
currentThread
public static Thread currentThread()返回對當前正在執行的線程對象的引用。
14.2 IO流
14.2.1 java.io Class File
■ 一個File對象代表了一個文件或目錄
File f=new File("1.txt");//在堆里申請了個File對象的空間
f.createNewFile();//創建了個文件對象,不會產生文件,只有操作File對去創建文件
f.delete();
f.mkdir();
System.out.println(f.getName());//相對路徑
System.out.println(f.getAbsolutePath());//絕對路徑
■ File[] listFiles(FileFilter filter)
返回表示此抽象路徑名所表示目錄中的文件和目錄的抽象路徑名數組,這些路徑名滿足特定過濾器。
java.io
接口 FileFilter
accept
boolean accept(File pathname)
File pathname是指被遍歷目錄中所有文件和目錄
作業:打印目錄下所有的.java文件,包括子目錄(提示:遞歸)
14.2.2
■ io流是用于JVM和數據源之間交換數據
| | | |
| | | |
| | | |
| --------------- DB |
| JVM 流 net |
| --------------- file|
| | | |
| | | |
■ 一個流也是個對象
流的分類:輸入流、輸出流
字節流、字符流
節點流、過濾流 (功能,過濾流是給其它增加個功能,本身不傳輸數據)
■ 裝飾模式
武器
/ \
/ \
槍(節點流) 零件
/|\ \
/ | \ \ \ \
瞄 消 M P S L
(過濾流)
14.2.3.1 字節輸入流
java.io
類 InputStream
字節輸入流的所有類的超類
■ java.io
類 FileInputStream
public FileInputStream(String name)
throws FileNotFoundException//文件不存在會拋異常
FileInputStream(File file)
FileInputStream(FileDescriptor fdObj)
■ FileInputStream中方法介紹
void close()
關閉此文件輸入流并釋放與此流有關的所有系統資源
int read()
從此輸入流中讀取一個數據字節。
返回下一個數據字節;如果已到達文件末尾,則返回 -1。
int read(byte[] b)
從此輸入流中將最多 b.length 個字節的數據讀入一個字節數組中。
返回:讀入緩沖區的字節總數,如果因為已經到達文件末尾而沒有更多的數據,則返回 -1。
int read(byte[] b, int off, int len)
從此輸入流中將最多 len 個字節的數據讀入一個字節數組中。
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -