




已閱讀5頁,還剩89頁未讀, 繼續(xù)免費閱讀
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
一 基礎知識 1 JVM JRE 和 JDK 的區(qū)別 JVM Java Virtual Machine java 虛擬機 用于保證 java 的跨平臺的特性 java 語言是跨平臺 jvm 不是跨平臺的 JRE Java Runtime Environment java 的運行環(huán)境 包括 jvm java 的核心類庫 JDK Java Development Kit java 的開發(fā)工具 包括 jre 開發(fā)工具 2 環(huán)境變量 path 和 classpath 的作用是什么 1 path 是配置 Windows 可執(zhí)行文件的搜索路徑 即擴展名為 exe 的程序文件所在的目 錄 用于指定 DOS 窗口命令的路徑 2 Classpath 是配置 class 文件所在的目錄 用于指定類搜索路徑 JVM 就是通過它來 尋找該類的 class 類文件的 3 變量有什么用 為什么要定義變量 什么時候用 答 變量的作用 用來存儲數(shù)據(jù) 為什么要定義變量 用來不斷的存放同一類型的常量 并可以重復使用 4 在內存中做了哪些事情 1 將 Person class 文件加載進內存中 2 如果 p 定義在主方法中 那么 就會在??臻g開辟一個變量空間 p 3 在堆內存給對象分配空間 4 對對象中的成員進行默認初始化 5 對對象中的成員進行顯示初始化 6 調用構造代碼塊對對象進行初始化 如果沒有就不執(zhí)行 7 調用構造方法對對象進行初始化 對象初始化完畢 8 將對象的內存地址賦值給 p 變量 讓 p 變量指向該對象 11 static 關鍵字 1 靜態(tài)的意思 用來修飾成員變量和成員函數(shù) 2 靜態(tài)的特點 隨著類的加載而加載 優(yōu)先于對象存在 對所有對象共享 可以被類名直接調用 3 靜態(tài)的注意事項 A 靜態(tài)方法只能訪問靜態(tài)成員 為什么 因為靜態(tài)的內容是隨著類的加載而加載 它是先進內存的 B 靜態(tài)方法中不能使用 this super 關鍵字 C 主方法是靜態(tài)的 public static void main String args public 公共的意思 是最大權限修飾符 static 由于 jvm 調用 main 方法的時候 沒有創(chuàng)建對象 只能通過類名調用 所以 main 必須用 static 修飾 void 由于 main 方法是被 jvm 調用 不需要返回值 用 void 修飾 main main 是主要的意思 所以 jvm 采用了這個名字 是程序的入口 String 字符串數(shù)組 args 數(shù)組名 在運行的時候 通過 java 命令給 args 數(shù)組賦值 格式 java MainTest hello world itcast 4 靜態(tài)變量和成員變量的區(qū)別 A 調用方式 靜態(tài)變量也稱為類變量 可以直接通過類名調用 也可以通過對象名調用 這個變量屬于類 成員變量也稱為實例變量 只能通過對象名調用 這個變量屬于對象 B 存儲位置 靜態(tài)變量存儲在方法區(qū)長中的靜態(tài)區(qū) 成員變量存儲在堆內存 C 生命周期 靜態(tài)變量隨著類的加載而存在 隨著類的消失而消失 生命周期長 成員變量隨著對象的創(chuàng)建而存在 隨著對象的消失而消失 D 與對象的相關性 靜態(tài)變量是所有對象共享的數(shù)據(jù) 成員變量是每個對象所特有的數(shù)據(jù) 5 靜態(tài)的優(yōu)點和弊端 優(yōu)點 對對象的共享數(shù)據(jù)進行單獨空間的存儲 節(jié)省內存 沒有必要每個對象都存儲一 份 可直接被類名調用 弊端 生命周期過長 隨著類的消失而消失 訪問出現(xiàn)權限 即靜態(tài)雖好但只能訪問靜態(tài) 6 什么使用使用靜態(tài)呢 A 當所有對象共享某個數(shù)據(jù)的時候 就把這個成員變量定義為靜態(tài)修飾的 B 當某個方法沒有訪問該類中的非靜態(tài)成員 就可以把這個方法定義為靜態(tài)修飾 靜態(tài)的生命周期比較長 所以一般不推薦使用 7 靜態(tài)代碼塊 A 它只執(zhí)行一次 它比 main 還先執(zhí)行 B 執(zhí)行順序 靜態(tài)代碼塊 構造代碼塊 構造方法 12 制作 API 次重點 API 全拼 Application Program Interface 應用程序編程接口 1 類中的內容需要用文檔注釋 2 使用 JDK bin 目錄下的 javadoc 工具 格式 javadoc d 目錄 author version ArrayTool java 13 單例設計模式 1 設計模式 解決某類問題行之有效的方法 是一種思想 是規(guī)律的總結 2 用來保證某個類在內存中只有一個對象 3 保證唯一性的思想及步驟 為了避免其他程序建立該類對象 先禁止其他程序建立該類對象 即將構造函 數(shù)私有化 為了其他程序訪問到該類對象 須在本類中創(chuàng)建一個該類私有對象 為了方便其他程序訪問到該類對象 可對外提供一個公共訪問方式 比如 API 中的 Runtime 類就是單例設計模式 4 單例設計模式的兩種方式 A 餓漢式 當類加載的時候 就創(chuàng)建對象 class Student private Student private static final Student s new Student public static Student getInstance return s B 懶漢式 當使用的使用 才去創(chuàng)建對象 class Student private Student private static final Student s null public static Student getInstance if s null 線程 1 就進來了 線程 2 就進來了 s new Student return s 餓漢式和懶漢式的區(qū)別 餓漢式是類一加載進內存就創(chuàng)建好了對象 懶漢式則是類才加載進內存的時候 對象還沒有存在 只有調用了 getInstance 方 法時 對象才開始創(chuàng)建 懶漢式是延遲加載 如果多個線程同時操作懶漢式時就有可能出現(xiàn)線程安全問題 解決線程安全問題 可以加同步來解決 但是加了同步之后 每一次都要比較鎖 效率就變慢了 所以可以加雙重判斷來提高程序效率 注 開發(fā)常用餓漢式 因為餓漢式簡單安全 懶漢式多線程的時候容易發(fā)生問題 14 Math 類的使用 重點 1 數(shù)學操作類 該類沒有構造函數(shù) 方法均為靜態(tài)的 2 掌握內容 A 成員變量 E 比任何其他值都更接近 e 即自然對數(shù)的底數(shù) 的 double 值 PI 比任何其他值都更接近 pi 即圓的周長與直徑之比 的 double 值 B 成員方法 static double abs double a 返回 double 值的絕對值 返回絕對值 static double ceil double a 返回最小的 最接近負無窮大 double 值 該值大于等于參數(shù) 并等于 某個整數(shù) static double floor double a 返回最大的 最接近正無窮大 double 值 該值小于等于參數(shù) 并等于 某個整數(shù) max 返回兩個值中較大的那個 min 返回兩個值中較小的那個 static long round double a 返回最接近參數(shù)的 long static int round float a 返回最接近參數(shù)的 int static double random 返回帶正號的 double 值 該值大于等于 0 0 且小于 1 0 static double pow double a double b 返回第一個參數(shù)的第二個參數(shù)次冪的值 static double sqrt double a 返回正確舍入的 double 值的正平方根 15 Random 類的使用 重點 1 產(chǎn)生隨機數(shù)的類 2 掌握內容 A 構造方法 Random 創(chuàng)建一個新的隨機數(shù)生成器 Random long seed 使用單個 long 種子創(chuàng)建一個新的隨機數(shù)生成器 B 成員方法 int nextInt 返回下一個偽隨機數(shù) 它是此隨機數(shù)生成器的序列中均勻分布 的 int 值 int nextInt int n 返回一個偽隨機數(shù) 它是取自此隨機數(shù)生成器序列的 在 0 包括 和指定值 不包括 之間均勻分布的 int 值 16 Scanner 類的使用 1 可以獲取從鍵盤的輸入數(shù)據(jù) 2 掌握內容 構造方法 Scanner InputStream source 構造一個新的 Scanner 它生成的值是從指定的 輸入流掃描的 如 Scanner sc new Scanner System in 方法摘要 sc nextInt 獲取整型數(shù)據(jù) sc nextLine 獲取字符串數(shù)據(jù) 17 繼承 重點 1 把很多類的相同特征和行為進行抽取 用一個類來描述 讓多個類和這個類產(chǎn)生一 個關系 這樣的話 多個類就可以省略很多代碼 這個關系就是繼承 java 中用 extends 關 鍵字表示 2 繼承的體系結構 A 多個具體的對象 不斷的向上抽取共享的內容 最終形成了一個體系 這個體 系叫做繼承體系 B 繼承體系的學習和使用原則 學習頂層的內容 因為他是整個體系的共性內容 創(chuàng)建子類使用 也就是使用底層的具體對象 3 繼承的特點 A java 中只能單繼承 沒有多繼承 B java 可以有多重 層 繼承 4 繼承的好處 繼承的出現(xiàn)提高了代碼的復用性 繼承的出現(xiàn)讓類與類之間產(chǎn)生了關系 提供了多態(tài)的前提 5 子父類中的成員關系 A 成員變量 在子類方法中使用一個變量時 首先 在方法的局部變量中找這個變量 有則使用 否則 在本類中找成員變量 有則使用 否則 在父類中找成員變量 有則使用 否則 報錯 B 成員方法 用子類對象使用一個方法時 首先 在子類中找這個方法 有則使用 否則 在父類中找這個方法 有則使用 否則 報錯 重寫和重載的區(qū)別 重載 在同一類中 方法名相同 參數(shù)列表不同 重載可以改變返回類型 重寫 在不同類中 子父類中 方法聲明相同 返回類型 方法名 參數(shù)列表均相同 重寫需要注意 子類方法的訪問權限要大于等于父類方法的訪問權限 靜態(tài)只能重寫靜態(tài) 但是這種情況一般不會出現(xiàn) 構造方法 子類的實例化過程 子類創(chuàng)建對象時 會先去創(chuàng)建父類的對象 默認是去調用父類的無參構造方法 子類構造方法中 第一行默認是 super 為什么子類中第一行會默認有 super 因為他繼承父類的成員使用 使用前這些成員必須初始化 而他們是父類的成員 所以 必須通過父類進行初始化 所以 會先創(chuàng)建一個父類的對象 當父類沒有無參構造方法時 必須使用 this 或者 super 調用其他的構造方法 6 this 和 super 的區(qū)別 this 代表本類對象的引用 super 代表父類的存儲空間 18 final 關鍵字 重點 1 最終的意思 可以用于修飾類 方法 變量 2 final 修飾的類不能被繼承 final 修飾的方法不能被重寫 final 修飾的變量是一個常量 只能被賦值一次 內部類只能訪問被 final 修飾的局部變量 19 抽象類 重點 1 多個類有相同的方法聲明 但是方法體不一樣 這個時候 我們考慮把方法聲明進 行抽取 讓子類繼承后 自己去實現(xiàn)方法體 沒有方法體的方法 我們需要用抽象標志下 抽象的關鍵字是 abstract 2 抽象類 該方法稱為抽象方法 包含抽象方法的類就是抽象類 3 抽象類的特點 A 抽象類和抽象方法都要用 abstract 進行修飾 B 抽象類不能被實例化 C 抽象類中不一定有抽象方法 但是 有抽象方法的類一定是抽象類 4 抽象類中數(shù)據(jù)的特點 A 成員變量 抽象類中可以有變量 也可以有常量 B 成員方法 抽象類中可以有抽象方法 也可以有非抽象方法 C 構造方法 抽象類是一個類 所以 它有構造方法 雖然本身不能實例化 但是可以給子類實例化使用 5 抽象類中的問題 A 抽象類中是否有構造方法 能不能被實例化 如果不能 為什么有構造方法 抽象類有構造方法 抽象類不能被實例化 抽象類中的構造方法供子類實例化調用 B 抽象關鍵字 abstract 不可以和哪些關鍵字共存 private 私有內容子類繼承不到 所以 不能重寫 但是 abstract 修飾的方法 要求被重寫 兩者沖突 final final 修飾的方法不能被重寫 而 abstract 修飾的方法 要求被重寫 兩者沖突 static 假如一個抽象方法能通過 static 修飾 那么這個方法 就可以直接通過類名 調用 而抽象方法是沒有方法體的 這樣的調用無意義 所以 不能用 static 修飾 C 抽象類中可不可以沒有抽象方法 如果可以 這樣的類有什么用嗎 抽象類可以沒有抽象方法 抽象類中沒有抽象方法的作用 只是為了不讓別的類建立該抽象類對象 這個 在 awt 中有體現(xiàn) 20 接口 interface 1 當一個類中的方法都是抽象的時候 java 提供了另一種表示方式 叫接口 用 interface 關鍵字表示 類與接口關系用 implements 表示 2 接口的成員特點 A 成員變量 是常量 默認修飾 public static final B 成員方法 都是抽象的 默認修飾 public abstract 3 關系 A 類與類的關系 是繼承關系 類與類只能單繼承 可以多重繼承 B 類和接口的關系 是實現(xiàn)關系 類可以多實現(xiàn)接口 類在繼承一個類的同時 可以實現(xiàn)多個接口 C 接口和接口的關系 是繼承關系 接口可以多繼承接口 4 接口的特點 A 是對外暴露的規(guī)則 B 是功能的擴展 C 接口的出現(xiàn)降低耦合性 耦合 類與類之間的關系 內聚 類完成功能的能力 編程規(guī)范 低耦合 高內聚 D 接口可以多實現(xiàn) 如 CPU 和主板 筆記本的 USB 插口 插座 5 接口和抽象類的區(qū)別 A 抽象類只能被單繼承 接口可以多實現(xiàn) 接口的出現(xiàn)避免了多繼承的局限性 B 抽象類中的數(shù)據(jù)特點 成員變量 可以是變量 也可以是常量 成員方法 可以是抽象方法 也可以是非抽象方法 構造方法 有構造方法 接口中的數(shù)據(jù)特點 成員變量 是常量 默認修飾 public static final 成員方法 都是抽象方法 都有默認修飾 public abstract 構造方法 沒有構造方法 C 抽象類中定義的是繼承體系中的共性功能 接口中定義的是繼承體系中的擴展功能 D 抽象類被繼承是 is a 關系 xx 是 yy 的一種 接口被實現(xiàn)是 like a 關系 xx 像 yy 的一種 21 多態(tài) 1 同一個對象 在程序不同時刻的多種運行狀態(tài) 舉例 動物 狗是狗 狗是動物 水 氣態(tài) 液態(tài) 固態(tài) 2 多態(tài)前提 A 存在著繼承或者實現(xiàn)關系 B 有方法的重寫 C 父類 接口 引用指向子類 實現(xiàn) 對象 3 多態(tài)的好處和弊端 好處 多態(tài)的存在提高了程序的擴展性和后期可維護性 弊端 雖然可以預先使用 但是只能訪問父類中已有的功能 運行的是后期子類 的功能內容 不能預先使用子類中定義的特有功能 4 多態(tài)中對象調用成員的特點 Fu f new Zi A 成員變量 編譯看左邊 運行看左邊 B 成員方法 編譯看左邊 運行看右邊 C 靜態(tài)方法 編譯看左邊 運行看左邊 5 多態(tài)的思想 指揮同一批對象做事情 舉例 帶兵打仗 下課等 22 instanceof 關鍵字 A 用于判斷某個對象是否是某種類型 B 格式 對象名 instanceof 子類 實現(xiàn) 名 23 Object 類 1 是所有類的根類 超類 java 中提供的類以及我們自定義的類都直接或者間接的繼承自 Object 類 2 Object 類中的方法 A void finalize 當垃圾回收器確定不存在對該對象的更多引用時 由對象的垃圾回收器調用此 方法 B Class getClass 獲取對象的字節(jié)碼文件的描述類 后面再講反射的時候還會在說這個類 String name s getClass getName C int hashCode 獲取對象的哈希值 其實就是對象的內存地址值十進制表示 D String toString 返回對象的字符串表示 表示格式 getClass getName Integer toHexString hashCode 一般我們輸出對象名的時候 其實底層調用的就是該對象的 toString 方法 這種返回沒有意義 所以 我們會重寫這個方法 顯示類的成員變量信息 E boolean equals Object obj 用于比較兩個對象的地址值是否相同 我們獲取對象后 比較它的地址值意義不大 所以也會對這個方法進行重寫 重寫要完成什么功能 是根據(jù)需求定的 3 和 equals 的用法 A 怎么用 可以用于比較基本數(shù)據(jù)類型 比較的就是基本數(shù)據(jù)類型的值是否相等 可以用于比較引用數(shù)據(jù)類型 比較的是對象的地址值是否相等 B equals 怎么用 equals 只能用于比較引用數(shù)據(jù)類型的 Object 提供的 equals 是用于比較對象地址值是否相同 自定義類中 如果重寫了 equals 方法 那么就是按照你自己的需求來比較 的 24 package 關鍵字 1 包 其實就是文件夾 用于區(qū)分不同包下相同的類名 2 好處 A 對類文件進行分類管理 B 給類提供了多層命名空間 aaa Demo bbb Demo C 寫在程序文件的第一行 D 包也是一種封裝形式 25 import 關鍵字 1 導入包的關鍵字 2 格式 import 包名 3 注意 A 一個程序文件中只有一個 package 可以有多個 import B 用來導包中的類 不導入包中的包 C 通常寫 import mypack Demo 明確自己使用的類 4 關鍵字的順序 類 包 導包這些關鍵的順序 包 到包 類 26 不同修飾符可以修飾哪些內容 本類中同一個包中 不同包中的子類中 不同包中 privateOK 默認OK Ok protected OK Ok OK publicOK Ok OK Ok 類構造方法成員變量成員方法 privateOKOKOK 默認Ok OkOkOK protectedOKOKOk public OkOkOKOK staticOKOk finalOkOKOK abstractOkOK 一般格式 成員變量 權限修飾符 static final 數(shù)據(jù)類型 成員變量名 public static final int NUM 10 成員方法 權限修飾符 static final abstract 返回類型 方法名 27 內部類 次重點 1 把一個類定義在某個類中的 這個類就被稱為內部類 內置類 嵌套類 2 訪問特點 A 內部類可以直接訪問外部類中的成員 因為內部類持有外部類的引用 格式為 外部類名 this B 外部類要想訪問內部類的成員 必須創(chuàng)建對象訪問 3 內部類的訪問格式 A 當內部類定義在外部類的成員位置 而且非私有 則可以在其他外部類中直接 建立內部類對象 格式 外部類名 內部類名 變量名 new 外部類對象 內部類對象 如 Outer Inner in new Outer new Inner B 當內部類在外部類成員位置 且被 static 修飾時 外部其他類可直接訪問靜態(tài)內部類的非靜態(tài)成員 格式 new 外部類名 內部類名 內部類成員 如 new Outer Inner function 外部其他類可直接訪問靜態(tài)內部類的靜態(tài)成員 格式 new 外部類名 內部類名 內部類成員 如 new Outer Inner function 4 什么使用時候內部類呢 假如有 A 類和 B 類 A 類想直接訪問 B 類的成員 B 類訪問 A 類成員的時候 需要創(chuàng)建 A 類對象進行訪問 這個時候 就可以把 A 類定義為 B 類的內部類 5 內部類的位置 A 成員位置 可以被 private 修飾 Body Heart 可以被 static 修飾 它訪問的外部類的成員必須是靜態(tài)的 B 局部位置 可以直接訪問外部類中的成員 因為還持有外部類的持用 也可以直接訪問局部成員 但是局部成員要用 final 修飾 注意 局部內部類不能用 private 和 static 修飾 6 通過 class 文件我們就可以區(qū)分是否帶有內部類 以及內部類的位置 Outer Inner 成員內部類 Outer 1Inner 局部內部類 28 匿名內部類 局部內部類的簡寫 重點 1 前提 繼承一個類或者實現(xiàn)一個接口 注意不要弄混匿名內部類的前提和多態(tài)的前提 2 格式 new 父類名或者接口名 重寫父類方法或者實現(xiàn)接口中的方法 也可以自定義其他方法 3 什么時候定義匿名內部類 匿名內部類只是為了簡化書寫 匿名內部類有局限 通常定義匿名內部類時 該類方法不超過 3 個 4 匿名內部類的好處和弊端 好處 簡化代碼書寫 弊端 不能直接調用自己的特有方法 不能執(zhí)行強轉換動作 如果該類里面方法較多 不允許使用匿名內部類 29 模板設計模式 在定義功能時 功能的一部分是確定的 有一部分是不確定的 而且確定的部分在使 用不確定的部分 可將不確定的部分暴露出去 由該類的子類去完成 如 求一段程序的運行時間例子 30 異常 1 程序運行過程中的不正常現(xiàn)象就叫異常 2 導致程序運行不正常的現(xiàn)象有很多 所以 就有很多的異常對象 而這些異常對象存在著共性的內容 所以 可以不斷的進行抽取 最終形成了異常 的體系結構 異常體系的根類是 Throwable Throwable Error 重大的問題 我們處理不了 也不需要編寫代碼處理 比如說內存溢出 Exception 一般性的錯誤 是需要我們編寫代碼進行處理的 RuntimeException 運行時異常 這個我們也不需要處理 其實就是為了讓他在運行時出問題 然后我們回來修 改代碼 3 異常的分類 異常有兩種 編譯時被檢測異常 該異常在編譯時 如果沒有處理 沒有拋也沒有 try 編譯失敗 該異常被標識 代表這可以被處理 運行時異常 編譯時不檢測 在編譯時 不需要處理 編譯器不檢查 該異常的發(fā)生 建議不處理 讓程序停止 需要對代碼進行修正 4 異常體系的特點 異常體系中的所有類及其子類對象都具備可拋性 也就是說可以被 throw 和 throws 關鍵字所操作 5 main 方法是如何處理異常的 A 在 main 里面編寫代碼進行處理 B 交給 jvm 自己進行處理 采用的是 jvm 的默認處理方式 其實就是相當于調用了異常對象的 printStackTrace 方法 6 Throwable 類的學習 getMessage 獲取異常信息 返回字符串 toString 獲取異常類名和異常信息 返回字符串 printStackTrace 獲取異常類名和異常信息 以及異常出現(xiàn)在程序中的位置 返回 值 void 7 異常的處理 A try catch finally 基本格式 try 可能出現(xiàn)異常的代碼 catch 異常對象 異常處理代碼 finally 釋放資源 變形格式 try catch try catch catch try catch catch finally 多個異常同時被捕獲的時候 記住一個原則 先逮小的 再逮大的 finally 永遠被執(zhí)行 除非退出 jvm System exit 0 面試題 2 個 final finally finalize 區(qū)別 final 是最終的意思 它可以用于修飾類 成員變量 成員方法 它修飾的類不能被繼承 它修飾的變量時常量 它修飾的方法不能被重寫 finally 是異常處理里面的關鍵字 它其中的代碼永遠被執(zhí)行 特殊情況 在執(zhí)行它之前 jvm 退出 System exit 0 finalize 是 Object 類中的一個方法 它是于垃圾回收器調用的方式 假如 catch 中有 return 語句 finally 里中的代碼會執(zhí)行嗎 是在 return 前 還是在 return 后呢 會 在 return 前執(zhí)行 finally 里面的代碼 8 Exception 和 RuntimeException 的區(qū)別 A Exception 一般性的錯誤 是需要我們編寫代碼進行處理的 B RuntimeException 運行時異常 這個我們也不需要處理 其實就是為了讓他在運行時出問題 然后我們回來修改代碼 在用 throws 拋出一個的時候 如果這個異常是屬于 RuntimeException 的體系 的時候 我們在調用的地方可以不用處理 RuntimeException 和 RuntimeException 的 子類 在用 throws 拋出一個的時候 如果這個異常是屬于 Exception 的體系的時候 我們在調用的地方必須進行處理或者繼續(xù)拋出 9 自定義異常 定義類繼承 Exception 或者 RuntimeException 1 為了讓該自定義類具備可拋性 2 讓該類具備操作異常的共性方法 class MyExcepiton extends Exception MyExcepiton MyExcepiton String message super message class MyException extends RuntimeException MyExcepiton MyExcepiton String message super message 10 throws 和 throw 的區(qū)別 A 有 throws 的時候可以沒有 throw 有 throw 的時候 如果 throw 拋的異常是 Exception 體系 那么必須有 throws 在方法上聲明 B throws 用于方法的聲明上 其后跟的是異常類名 后面可以跟多個異常類 之間用逗號隔開 throw 用于方法體中 其后跟的是一個異常對象名 三 多線程 1 進程和線程 進程 正在進行的程序 每一個進程執(zhí)行都有一個執(zhí)行順序 該順序是一個執(zhí)行路徑 或者叫一個控制單元 線程 進程內部的一條執(zhí)行路徑或者一個控制單元 兩者的區(qū)別 一個進程至少有一個線程 進程在執(zhí)行過程中擁有獨立的內存單元 而多個線程共享內存 2 jvm 多線程的啟動是多線程嗎 java 的虛擬機 jvm 啟動的是單線程 就有發(fā)生內存泄露的可能 而我們使用 java 程序 沒出現(xiàn)這樣的問題 也就是 jvm 啟動至少有兩個線程 一個執(zhí)行 java 程序 一個執(zhí)行垃圾回收 所以是多 線程 2 多線程的優(yōu)勢 解決了多部分同時運行的問題 提高效率 3 線程的弊端 線程太多會導致效率的降低 因為線程的執(zhí)行依靠的是 CPU 的來回切換 4 什么叫多線程 一個進程中有多個線程 稱為多線程 5 實現(xiàn)多線程的方法 實現(xiàn)多線程可以通過繼承 Thread 類和實現(xiàn) Runnable 接口 1 繼承 Thread 定義一個類繼承 Thread 類 復寫 Thread 類中的 public void run 方法 將線程的任務代碼封裝到 run 方法中 直接創(chuàng)建 Thread 的子類對象 創(chuàng)建線程 調用 start 方法 開啟線程 調用線程的任務 run 方法 另外可以通過 Thread 的 getName 獲取線程的名稱 2 實現(xiàn) Runnable 接口 定義一個類 實現(xiàn) Runnable 接口 覆蓋接口的 public void run 的方法 將線程的任務代碼封裝到 run 方法中 創(chuàng)建 Runnable 接口的子類對象 將 Runnabl 接口的子類對象作為參數(shù)傳遞給 Thread 類的構造函數(shù) 創(chuàng)建 Thread 類 對象 原因 線程的任務都封裝在 Runnable 接口子類對象的 run 方 法中 所以要在線程對象創(chuàng)建時就必須明確要運行的任務 調用 start 方法 啟動線程 兩種方法區(qū)別 1 實現(xiàn) Runnable 接口避免了單繼承的局限性 2 繼承 Thread 類線程代碼存放在 Thread 子類的 run 方法中 實現(xiàn) Runnable 接口線程代碼存放在接口的子類的 run 方法中 在定義線程時 建議使用實現(xiàn) Runnable 接口 因為幾乎所有多線程都可以使 用這種方式實現(xiàn) 6 創(chuàng)建線程是為什么要復寫 run 方法 Thread 類用于描述線程 Thread 類定義了一個功能 用于存儲線程要運行的代碼 該 存儲功能就是 run 方法 7 start 和 run 方法有什么區(qū)別 調用 start 方法方可啟動線程 而 run 方法只是 thread 的一個普通方法 調用 run 方法 不能實現(xiàn)多線程 Start 方法 start 方法用來啟動線程 實現(xiàn)了多線程運行 這時無需等待 run 方法體代碼執(zhí)行完畢 而直接繼續(xù)執(zhí)行下面的 代碼 通過調用 Thread 類的 start 方法來啟動一個線程 這時此線程處于就緒 可運 行 狀態(tài) 并沒有運行 一旦得到 cpu 時間片 執(zhí)行權 就開始執(zhí)行 run 方法 這里方法 run 稱為線程體 它包含了要執(zhí)行的這個線程的內容 Run 方法運行結束 此線程隨即終止 Run 方法 run 方法只是 Thread 類的一個普通方法 如果直接調用 Run 方法 程序中依然只有 主線程這一個線程 其程序執(zhí)行路徑還是只有一條 還是要等待 run 方法體執(zhí)行完畢后才可繼續(xù)執(zhí)行 下面的代碼 這樣就沒有達到多線程的目的 8 線程的幾種狀態(tài) 新建 new 一個 Thread 對象或者其子類對象就是創(chuàng)建一個線程 當一個線程對象被創(chuàng) 建 但是沒有開啟 這個時候 只是對象線程對象開辟了內存空間和初始化數(shù)據(jù) 就緒 新建的對象調用 start 方法 就開啟了線程 線程就到了就緒狀態(tài) 在這個狀態(tài)的線程對象 具有執(zhí)行資格 沒有執(zhí)行權 運行 當線程對象獲取到了 CPU 的資源 在這個狀態(tài)的線程對象 既有執(zhí)行資格 也有執(zhí)行權 凍結 運行過程中的線程由于某些原因 比如 wait sleep 釋放了執(zhí)行資格和執(zhí)行權 當然 他們可以回到運行狀態(tài) 只不過 不是直接回到 而是先回到就緒狀態(tài) 死亡 當線程對象調用的 run 方法結束 或者直接調用 stop 方法 就讓線程對象死亡 在內存中變成了垃圾 9 sleep 和 wait 的區(qū)別 1 這兩個方法來自不同的類 sleep 來自 Thread 類 和 wait 來自 Object 類 2 sleep 是 Thread 的靜態(tài)類方法 誰調用的誰去睡覺 即使在 a 線程里調用了 b 的 sleep 方法 實際上還是 a 去睡覺 要讓 b 線程睡覺要在 b 的代碼中調用 sleep 而 wait 是 Object 類的非靜態(tài)方法 3 sleep 釋放資源不釋放鎖 而 wait 釋放資源釋放鎖 4 使用范圍 wait notify 和 notifyAll 只能在同步控制方法或者同步控制塊里面使用 而 sleep 可以在任何地方使用 10 多線程安全問題 1 原因 當程序的多條語句在操作線程共享數(shù)據(jù)時 如買票例子中的票就是共享資源 由于線程的隨機性導致 一個線程對多條語句 執(zhí)行了一部分還沒執(zhí)行完 另一個線程搶奪到 cpu 執(zhí) 行權參與進來執(zhí)行 此時就導致共享數(shù)據(jù)發(fā)生錯誤 比如買票例子中打印重票和錯票的情況 2 解決方法 對多條操作共享數(shù)據(jù)的語句進行同步 一個線程在執(zhí)行過程中其他線程不 可以參與進來 11 Java 中多線程同步是什么 同步是用來解決多線程的安全問題的 在多線程中 同步能控制對共享數(shù)據(jù)的訪問 如果沒有同步 當一個線程在 修改一個共享數(shù)據(jù)時 而另外一個線程正在使用或者更新同一個共享數(shù)據(jù) 這樣容易 導致程序出現(xiàn)錯誤的結果 12 什么是鎖 鎖的作用是什么 鎖就是對象 鎖的作用是保證線程同步 解決線程安全問題 持有鎖的線程可以在同步中執(zhí)行 沒有鎖的線程即使獲得 cpu 執(zhí)行權 也進不去 13 同步的前提 1 必須保證有兩個以上線程 2 必須是多個線程使用同一個鎖 即多條語句在操作線程共享數(shù)據(jù) 3 必須保證同步中只有一個線程在運行 14 同步的好處和弊端 好處 同步解決了多線程的安全問題 弊端 多線程都需要判斷鎖 比較消耗資源 15 同步的兩種表現(xiàn)形式 1 同步代碼塊 可以指定需要獲取哪個對象的同步鎖 使用 synchronized 的代碼塊同樣需要鎖 但他 的鎖可以是任意對象 考慮到安全問題 一般還是使用同一個對象 相對來說效率較高 注意 雖然同步代碼快的鎖可以使任何對象 但是在進行多線程通信使用同步代碼快 時 必須保證同步代碼快的鎖的對象和 否則會報錯 同步函數(shù)的鎖是 this 也要保證同步函數(shù)的鎖的對象和調用 wait notify 和 notifyAll 的對象是 同一個對象 也就是都是 this 鎖代表的對象 格式 synchronized 對象 需同步的代碼 2 同步函數(shù) 同步方法是指進入該方法時需要獲取 this 對象的同步鎖 在方法上使用 synchronized 關鍵字 使用 this 對象作為鎖 也就是使用了當前對象 因為鎖住了方法 所以相對于代 碼塊來說效率相對較低 注 靜態(tài)同步函數(shù)的鎖是該方法所在的類的字節(jié)碼文件對象 即類名 class 文件 格式 修飾詞 synchronized 返回值類型 函數(shù)名 參數(shù)列表 需同步的代碼 在 jdk1 5 后 用 lock 鎖取代了 synchronized 個人理解也就是對同步代碼塊做了修改 并沒有提供對同步方法的修改 主要還是效率問題吧 16 多線程的單例設計模式 保證某個類中內存中只有一個對象 1 餓漢式 class Single private Single 將構造函數(shù)私有化 不讓別的類建立該類對象 private static final Single s new Single 自己建立一個對象 public static Single getInstance 提供一個公共訪問方式 return s 2 懶漢式 class Single private Single private static Single s public static Single getInstance if s null s new Single return s 餓漢式和懶漢式的區(qū)別 餓漢式是類一加載進內存就創(chuàng)建好了對象 懶漢式則是類加載進內存的時候 對象還沒有存在 只有調用了 getInstance 方法 時 對象才開始創(chuàng)建 懶漢式是延遲加載 如果多個線程同時操作懶漢式時就有可能出現(xiàn)線程安全問題 解決線程安全問題 可以加同步來解決 但是加了同步之后 每一次都要比較鎖 效率就變慢了 所以可以加雙重判斷來提高程序效率 如將上述懶漢式的 Instance 函數(shù)改成同步 public static Single getInstance if s null synchronized Single class if s null s new Single return s 17 死鎖 兩個線程對兩個同步對象具有循環(huán)依賴時 就會發(fā)生死鎖 即同步嵌套同步 而鎖卻 不同 18 wait sleep notify notifyAll wait 使一個線程處于等待狀態(tài) 并且釋放所持有的對象的 lock sleep 使一個正在運行的線程處于睡眠狀態(tài) 是一個靜態(tài)方法 調用此方法要捕捉 InterruptedException 異常 notify 喚醒一個處于等待狀態(tài)的線程 注意的是在調用此方法的時候 并不能確切的 喚醒某一個等待狀態(tài)的線程 而是由 JVM 確定喚醒哪個線程 一般是最先開始等待的線程 而且不是按優(yōu)先 級 Allnotity 喚醒所有處入等待狀態(tài)的線程 注意并不是給所有喚醒線程一個對象的鎖 而是讓它們競爭 18 為什么 wait notify notifyAll 這些用來操作線程的方法定義在 Object 類中 1 這些方法只存在于同步中 2 使用這些方法時必須要指定所屬的鎖 即被哪個鎖調用這些方法 3 而鎖可以是任意對象 所以任意對象調用的方法就定義在 Object 中 19 多線程間通訊 多線程間通訊就是多個線程在操作同一資源 但是操作的動作不同 1 為什么要通信 多線程并發(fā)執(zhí)行的時候 如果需要指定線程等待或者喚醒指定線程 那么就需要通 信 比如生產(chǎn)者消費者的問題 生產(chǎn)一個消費一個 生產(chǎn)的時候需要負責消費的進程等待 生產(chǎn)一個后完成后需要喚 醒負責消費的線程 同時讓自己處于等待 消費的時候負責消費的線程被喚醒 消費完生產(chǎn)的產(chǎn)品后 又將等待的生產(chǎn)線程喚醒 然后使自己線程處于等待 這樣來回通信 以達到生產(chǎn)一個消費一個的目的 2 怎么通信 在同步代碼塊中 使用鎖對象的 wait 方法可以讓當前線程等待 直到有其他線程 喚醒為止 使用鎖對象的 notify 方法可以喚醒一個等待的線程 或者 notifyAll 喚醒所有等待 的線程 多線程間通信用 sleep 很難實現(xiàn) 睡眠時間很難把握 20 Lock 和 Condition 實現(xiàn)提供比 synchronized 方法和語句可獲得的更廣泛的鎖的操作 可支持多個相關的 Condition 對象 Lock 是個接口 鎖是控制多個線程對共享數(shù)據(jù)進行訪問的工具 JDK1 5 中提供了多線程升級的解決方案 將同步 synchonized 替換成了顯示的 Lock 操作 將 Object 中的 wait notify notifyAll 替換成了 Condition 對象 該對象可以 Lock 鎖進行獲取 Lock 的方法摘要 void lock 獲取鎖 Condition newCondition 返回綁定到此 Lock 實例的新 Condition 實例 void unlock 釋放鎖 Condition 方法摘要 void await 造成當前線程在接到信號或被中斷之前一直處于等待狀態(tài) void signal 喚醒一個等待線程 void signalAll 喚醒所有等待線程 21 停止線程 stop 方法已經(jīng)過時 如何停止線程 停止線程的方法只有一種 就是 run 方法結束 如何讓 run 方法結束呢 開啟多線程運行 運行代碼通常是循環(huán)體 只要控制住循環(huán) 就可以讓 run 方法 結束 也就是結束線程 特殊情況 當線程屬于凍結狀態(tài) 就不會讀取循環(huán)控制標記 則線程就不會結束 為解決該特殊情況 可引入 Thread 類中的 Interrupt 方法結束線程的凍結狀態(tài) 當沒有指定的方式讓凍結線程恢復到運行狀態(tài)時 需要對凍結進行清除 強制讓 線程恢復到運行狀態(tài) 22 interrupt void interrupt 中斷線程 中斷狀態(tài)將被清除 它還將收到一個 InterruptedException 22 守護線程 后臺線程 setDaemon boolean on 將該線程標記為守護線程或者用戶線程 當主線程結束 守護線程自動結束 比如圣斗士星矢里面的守護雅典娜 在多線程里面主線程就是雅典娜 守護線程就是圣斗士 主線程結束了 守護線程則自動結束 當正在運行的線程都是守護線程時 java 虛擬機 jvm 退出 所以該方法必須在啟動線 程前調用 守護線程的特點 守護線程開啟后和前臺線程共同搶奪 cpu 的執(zhí)行權 開啟 運行兩者都沒區(qū)別 但結束時有區(qū)別 當所有前臺線程都結束后 守護線程會自動結束 23 多線程 join 方法 void join 等待該線程終止 void join long millis 等待該線程終止的時間最長為 millis 毫秒 throws InterruptedException 特點 當 A 線程執(zhí)行到 B 線程的 join 方法時 A 就會等待 B 線程都執(zhí)行完 A 才會 執(zhí)行 作用 join 可以用來臨時加入線程執(zhí)行 24 多線程優(yōu)先級 yield 方法 yield 暫停當前正在執(zhí)行的線程對象 并執(zhí)行其他線程 setPriority int newPriority 更改線程優(yōu)先級 int getPriority 返回線程的優(yōu)先級 String toString 返回該線程的字符串表示形式 包括線程名稱 優(yōu)先級和線程組 1 MAX PRIORITY 最高優(yōu)先級 10 級 1 Min PRIORITY 最低優(yōu)先級 1 級 1 Morm PRIORITY 默認優(yōu)先級 5 級 25 什么是 ThreadLocal 類 怎么使用它 ThreadLocal 類提供了線程局部 thread local 變量 是一個線程級別的局部變量 并 非 本地線程 ThreadLocal 為每個使用該變量的線程 提供了一個獨立的變量副本 每個線程修改副 本時不影響其它線程對象的副本 下面是線程局部變量 ThreadLocal variables 的關鍵點 一個線程局部變量 ThreadLocal variables 為每個線程方便地提供了一個單獨的變 量 ThreadLocal 實例通常作為靜態(tài)的私有的 private static 字段出現(xiàn)在一個類中 這個 類用來關聯(lián)一個線程 當多個線程訪問 ThreadLocal 實例時 每個線程維護 ThreadLocal 提供的獨立的 變量副本 常用的使用可在 DAO 模式中見到 當 DAO 類作為一個單例類時 數(shù)據(jù)庫鏈接 connection 被每一個線程獨立的維護 互不影響 基于線程的單例 26 什么時候拋出 InvalidMonitorStateException 異常 為什么 調用 wait notify notifyAll 中的任何一個方法時 如果當前線程沒有獲得該對象 的鎖 那么就會拋出 IllegalMonitorStateException 的異常 也就是說程序在沒有執(zhí)行對象的任何同步塊或者同步方法時 仍然嘗試調用 wait notify notifyAll 時 由于該異常是 RuntimeExcpetion 的子類 所以該異常不一定要捕獲 盡管你可以捕獲只要你愿意 作為 RuntimeException 此類異常不會在 wait notify notifyAll 的方法簽名提及 27 在靜態(tài)方法上使用同步時會發(fā)生什么事 同步靜態(tài)方法時會獲取該類的 Class 對象 所以當一個線程進入同步的靜態(tài)方法中 時 線程監(jiān)視器獲取類本身的對象鎖 其它線程不能進入這個類的任何靜態(tài)同步方法 它不像實例方法 因為多個線程可以同時訪問不同實例同步實例方法 28 當一個同步方法已經(jīng)執(zhí)行 線程能夠調用對象上的非同步實例方法嗎 可以 一個非同步方法總是可以被調用而不會有任何問題 實際上 Java 沒有為非同步方法做任何檢查 鎖對象僅僅在同步方法或者同步代碼塊 中檢查 如果一個方法沒有聲明為同步 即使你在使用共享數(shù)據(jù) Java 照樣會調用 而不會做檢 查是否安全 所以在這種情況下要特別小心 一個方法是否聲明為同步取決于臨界區(qū)訪問 critial section access 如果方法不訪問臨界區(qū) 共享資源或者數(shù)據(jù)結構 就沒必要聲明為同步的 29 在一個對象上兩個線程可以調用兩個不同的同步實例方法嗎 不能 因為一個對象已經(jīng)同步了實例方法 線程獲取了對象的對象鎖 所以只有執(zhí)行完該方法釋放對象鎖后才能執(zhí)行其它同步方法 30 什么是線程餓死 什么是活鎖 線程餓死和活鎖雖然不像死鎖一樣是常見的問題 但是對于并發(fā)編程的設計者來說就 像一次邂逅一樣 當所有線程阻塞 或者由于需要的資源無效而不能處理 不存在非阻塞線程使資源可 用 JavaAPI 中線程活鎖可能發(fā)生在以下情形 當所有線程在程序中執(zhí)行 Object wait 0 參數(shù)為 0 的 wait 方法 程序將發(fā)生活鎖直到在相應的對象上有線程調用 Object notify 或者 Object notifyAll 當所有線程卡在無限循環(huán)中 四 集合框架
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年虛擬現(xiàn)實技術在職業(yè)教育課程中的教學設計研究報告001
- 2025年醫(yī)院電子病歷系統(tǒng)在醫(yī)療大數(shù)據(jù)中的應用與優(yōu)化報告
- 2025年醫(yī)院電子病歷系統(tǒng)優(yōu)化構建醫(yī)療大數(shù)據(jù)分析平臺報告
- 終身學習視角下2025年成人教育體系構建與平臺運營的師資培訓策略報告
- 2025年醫(yī)藥流通行業(yè)供應鏈優(yōu)化與成本控制政策研究實踐報告
- 2025年醫(yī)藥流通行業(yè)供應鏈優(yōu)化與成本控制案例分析報告
- 保安證考試題及答案
- 安全員c證試題及答案
- 安全試題及答案和解析
- 零售私域流量運營的線上線下促銷活動策劃報告
- 中年危機人生規(guī)劃
- 《風電功率預測功能規(guī)范》
- 關于讀后續(xù)寫的可行操作課件-高三英語一輪復習
- 港口企業(yè)財務風險分析報告
- 2023年貴州黔西南州專項招聘國企業(yè)工作人員21人考前自測高頻難、易考點模擬試題(共500題)含答案詳解
- 中醫(yī)護理實訓報告總結
- 動畫制作與電影特效課件
- 監(jiān)理抽檢表 - 08橋梁工程
- 鼻息肉護理教學查房
- 小區(qū)交通安全應急預案
- 2023年第四屆全國郵政行業(yè)職業(yè)技能競賽-全國總決賽理論知識試題及答案
評論
0/150
提交評論