線程的生命周期
新建→就緒→運行→阻塞→死亡
New→Runnable→Running→Blocked→Dead
調(diào)用start進入就緒躯护。
線程死亡:run或call方法執(zhí)行完成
拋出未捕獲的異常Exception或Error
調(diào)用線程的stop方法(不推薦嚷闭,容易死鎖)
isAlive()中間三種狀態(tài)返回true
join方法讓一個線程等待另一個線程完成
后臺線程/守護線程/精靈線程 特征:前臺線程全部死亡艾凯,后臺就會自動死亡
如jvm的垃圾回收線程
O.setDaemon(true)設(shè)O對象為后臺線程,
線程睡眠:sleep,讓線程暫停点把,進入阻塞狀態(tài)
線程讓步:yield借宵,讓線程進入阻塞狀態(tài)幌衣,有優(yōu)先級的執(zhí)行
setPriority()設(shè)置線程優(yōu)先級
JVM終止:
程序正常結(jié)束
程序使用System.exit() Runtime.getRuntime().exit()
遇到為捕獲的異常
程序所在平臺強制結(jié)束Jvm進程
類加載或類初始化:加載→連接→初始化
類加載是指,將類的class讀入內(nèi)存,并為之創(chuàng)建一個java.lang.Class對象豁护。當程序使用任何類都會創(chuàng)建這么一個對象哼凯。
類加載由類加載器完成,由JVM提供
類的連接:把類的二進制數(shù)據(jù)合并到JRE中
驗證→準備→解析
驗證內(nèi)部結(jié)構(gòu)是否正確楚里,和其他類是否協(xié)調(diào)
準備:分配內(nèi)存断部、設(shè)置初始值
解析:將類的二進制數(shù)據(jù)中的符號引用替換成直接引用
創(chuàng)建實例的方法:new、反射班缎、反序列化
同一個類:全限定類名(包名蝴光、類名)JVM中靠全限定類名和加載器
JVM啟動時,會形成由三個類加載器組成的初始類加載器的層次結(jié)構(gòu)
Bootstrap ClassLoader:根類加載器
Extension ClassLoader:擴展類加載器:加載JRE擴展目錄中JAR包的類
System ClassLoader:系統(tǒng)類加載器
JVM類加載機制
全盤負責:class所依賴的和引用的其他Class也由該類加載器負責載入
父類委托:先讓父類加載器試圖加載該Class
緩存機制:所有加載過的Class都會被緩存达址,若不在緩存區(qū)虱疏,系統(tǒng)會讀取其二進制數(shù)據(jù),并將其轉(zhuǎn)換成Class對象苏携。修改了Class必須重新啟動JVM
通過反射創(chuàng)建對象兩種方式
①使用Class對象的newInstance()方法來創(chuàng)建該Class對象對應(yīng)類的實例
執(zhí)行newInstance()方法實際是利用默認構(gòu)造器來創(chuàng)建該類的實例
②先使用Class對象獲取Constructor對象做瞪,再調(diào)用Constructor的newInstance方法來創(chuàng)建該Class對象對應(yīng)的類的實例。
第一種方式比較常見
Public
進程和線程的主要差別在于它們是不同的操作系統(tǒng)資源管理方式右冻。進程有獨立的地址空間装蓬,一個進程崩潰后,在保護模式下不會對其它進程產(chǎn)生影響纱扭,而線程只是一個進程中的不同執(zhí)行路徑牍帚。線程有自己的堆棧和局部變量,但線程之間沒有單獨的地址空間乳蛾,一個線程死掉就等于整個進程死掉暗赶,所以多進程的程序要比多線程的程序健壯,但在進程切換時肃叶,耗費資源較大蹂随,效率要差一些。但對于一些要求同時進行并且又要共享某些變量的并發(fā)操作因惭,只能用線程岳锁,不能用進程
IO
異常
檢查異常需要手動拋出
集合
Static修飾的成員不能訪問沒有static修飾的成員,例如main方法要先創(chuàng)建對象蹦魔,才能訪問Sting激率、int之類的。通過實例可以訪問類變量勿决,因為類變量都在一塊內(nèi)存區(qū)里乒躺。
Static的真正作用:區(qū)分成員變量、方法低缩、內(nèi)部類嘉冒、初始化塊4
Java通過new調(diào)用構(gòu)造器,構(gòu)造器構(gòu)造實例,構(gòu)造器是類創(chuàng)建對象的根本途徑健爬。
構(gòu)造器的返回值默認是隱式的控乾。
方法名以英文動詞開頭,void用來聲明方法沒有返回值娜遵,否則有return
同一個對象里的一個成員可以直接調(diào)用另一個成員蜕衡,即省略this
Java里的方法的參數(shù)傳遞方式只有一種:值傳遞
子類無法訪問父類被覆蓋的方法,但可通過super或父類類名來調(diào)用设拟。子類和父類的private方法同名不是重寫慨仿。
外部類訪問權(quán)限只需要給同一個包和任何位置,所以public和 默認 纳胧。內(nèi)部類可以使用四種訪問權(quán)限镰吆。
JUC:
New Thread(new Runnable(){重寫run方法}).start
兩同:1)方法名2)形參列表兩小:1)返回值類型比父類更小或相等2)異常比父類方法更小或相等一大:子類權(quán)限比父類大或相等
被覆蓋的方法不能為private
命名合法:開頭_跑慕、$ 万皿、_1_
接口定義的成員變量默認public static final,所有成員方法為 public /abstract核行,只能被public和abstract修飾
構(gòu)造方法無法被程序調(diào)用
初始化順序:靜態(tài)成員變量牢硅、成員變量、構(gòu)造方法
按值傳遞不會改變實際參數(shù)的數(shù)值
按引用傳遞不會改變實際參數(shù)的參考地址芝雪,但能改變實際參數(shù)的內(nèi)容
編譯失敗减余,方法體中的有static
線程和進程的區(qū)別
Java中可作為gc root 的對象有哪些?
1 惩系、 虛擬機棧(棧幀中的本地變量表)中引用的對象位岔。
2、 本地方法棧中JNI(即一般說的native方法)引用的對象堡牡。
3抒抬、 方法區(qū)中的靜態(tài)變量和常量引用的對象。
-ha???W??k