- 簡(jiǎn)述線程,程序壁晒、進(jìn)程的基本概念瓷们。以及他們之間關(guān)系是什么
- 線程有哪些基本狀態(tài)?這些狀態(tài)是如何定義的?
31 關(guān)于 final 關(guān)鍵字的一些總結(jié)
32 Java 中的異常處理
Java異常類層次結(jié)構(gòu)圖
Trowable類常用方法
異常處理總結(jié)
33 Java序列話中如果有些字段不想進(jìn)行序列化 怎么辦
Java基礎(chǔ)學(xué)習(xí)書籍推薦
29. 簡(jiǎn)述線程秒咐,程序谬晕、進(jìn)程的基本概念。以及他們之間關(guān)系是什么
線程與進(jìn)程相似携取,但線程是一個(gè)比進(jìn)程更小的執(zhí)行單位攒钳。一個(gè)進(jìn)程在其執(zhí)行的過(guò)程中可以產(chǎn)生多個(gè)線程。與進(jìn)程不同的是同類的多個(gè)線程共享同一塊內(nèi)存空間和一組系統(tǒng)資源雷滋,所以系統(tǒng)在產(chǎn)生一個(gè)線程不撑,或是在各個(gè)線程之間作切換工作時(shí),負(fù)擔(dān)要比進(jìn)程小得多晤斩,也正因?yàn)槿绱嘶烂剩€程也被稱為輕量級(jí)進(jìn)程。
程序是含有指令和數(shù)據(jù)的文件澳泵,被存儲(chǔ)在磁盤或其他的數(shù)據(jù)存儲(chǔ)設(shè)備中实愚,也就是說(shuō)程序是靜態(tài)的代碼。
進(jìn)程是程序的一次執(zhí)行過(guò)程兔辅,是系統(tǒng)運(yùn)行程序的基本單位爆侣,因此進(jìn)程是動(dòng)態(tài)的。系統(tǒng)運(yùn)行一個(gè)程序即是一個(gè)進(jìn)程從創(chuàng)建幢妄,運(yùn)行到消亡的過(guò)程兔仰。簡(jiǎn)單來(lái)說(shuō),一個(gè)進(jìn)程就是一個(gè)執(zhí)行中的程序蕉鸳,它在計(jì)算機(jī)中一個(gè)指令接著一個(gè)指令地執(zhí)行著乎赴,同時(shí),每個(gè)進(jìn)程還占有某些系統(tǒng)資源如CPU時(shí)間潮尝,內(nèi)存空間榕吼,文件,文件勉失,輸入輸出設(shè)備的使用權(quán)等等羹蚣。換句話說(shuō),當(dāng)程序在執(zhí)行時(shí)乱凿,將會(huì)被操作系統(tǒng)載入內(nèi)存中顽素。 線程是進(jìn)程劃分成的更小的運(yùn)行單位咽弦。線程和進(jìn)程最大的不同在于基本上各進(jìn)程是獨(dú)立的,而各線程則不一定胁出,因?yàn)橥贿M(jìn)程中的線程極有可能會(huì)相互影響型型。從另一角度來(lái)說(shuō),進(jìn)程屬于操作系統(tǒng)的范疇全蝶,主要是同一段時(shí)間內(nèi)闹蒜,可以同時(shí)執(zhí)行一個(gè)以上的程序,而線程則是在同一程序內(nèi)幾乎同時(shí)執(zhí)行一個(gè)以上的程序段抑淫。
30. 線程有哪些基本狀態(tài)绷落?這些狀態(tài)是如何定義的?
- 新建(new):新創(chuàng)建了一個(gè)線程對(duì)象。
- 可運(yùn)行(runnable):線程對(duì)象創(chuàng)建后始苇,其他線程(比如main線程)調(diào)用了該對(duì)象的start()方法砌烁。該狀態(tài)的線程位于可運(yùn)行線程池中,等待被線程調(diào)度選中埂蕊,獲 取cpu的使用權(quán)往弓。
- 運(yùn)行(running):可運(yùn)行狀態(tài)(runnable)的線程獲得了cpu時(shí)間片(timeslice)疏唾,執(zhí)行程序代碼蓄氧。
- 阻塞(block):阻塞狀態(tài)是指線程因?yàn)槟撤N原因放棄了cpu使用權(quán),也即讓出了cpu timeslice槐脏,暫時(shí)停止運(yùn)行喉童。直到線程進(jìn)入可運(yùn)行(runnable)狀態(tài),才有 機(jī)會(huì)再次獲得cpu timeslice轉(zhuǎn)到運(yùn)行(running)狀態(tài)顿天。阻塞的情況分三種: (一). 等待阻塞:運(yùn)行(running)的線程執(zhí)行o.wait()方法堂氯,JVM會(huì)把該線程放 入等待隊(duì)列(waitting queue)中。 (二). 同步阻塞:運(yùn)行(running)的線程在獲取對(duì)象的同步鎖時(shí)牌废,若該同步鎖 被別的線程占用咽白,則JVM會(huì)把該線程放入鎖池(lock pool)中。 (三). 其他阻塞: 運(yùn)行(running)的線程執(zhí)行Thread.sleep(long ms)或t.join()方法鸟缕,或者發(fā)出了I/O請(qǐng)求時(shí)晶框,JVM會(huì)把該線程置為阻塞狀態(tài)。當(dāng)sleep()狀態(tài)超時(shí)join()等待線程終止或者超時(shí)懂从、或者I/O處理完畢時(shí)授段,線程重新轉(zhuǎn)入可運(yùn)行(runnable)狀態(tài)。
- 死亡(dead):線程run()番甩、main()方法執(zhí)行結(jié)束侵贵,或者因異常退出了run()方法,則該線程結(jié)束生命周期缘薛。死亡的線程不可再次復(fù)生窍育。
備注: 可以用早起坐地鐵來(lái)比喻這個(gè)過(guò)程:
還沒(méi)起床:sleeping
起床收拾好了卡睦,隨時(shí)可以坐地鐵出發(fā):Runnable
等地鐵來(lái):Waiting
地鐵來(lái)了,但要排隊(duì)上地鐵:I/O阻塞
上了地鐵蔫骂,發(fā)現(xiàn)暫時(shí)沒(méi)座位:synchronized阻塞
地鐵上找到座位:Running
到達(dá)目的地:Dead
31 關(guān)于 final 關(guān)鍵字的一些總結(jié)
final關(guān)鍵字主要用在三個(gè)地方:變量么翰、方法、類辽旋。
- 對(duì)于一個(gè)final變量浩嫌,如果是基本數(shù)據(jù)類型的變量,則其數(shù)值一旦在初始化之后便不能更改补胚;如果是引用類型的變量码耐,則在對(duì)其初始化之后便不能再讓其指向另一個(gè)對(duì)象。
- 當(dāng)用final修飾一個(gè)類時(shí)溶其,表明這個(gè)類不能被繼承骚腥。final類中的所有成員方法都會(huì)被隱式地指定為final方法。
- 使用final方法的原因有兩個(gè)瓶逃。第一個(gè)原因是把方法鎖定束铭,以防任何繼承類修改它的含義;第二個(gè)原因是效率厢绝。在早期的Java實(shí)現(xiàn)版本中契沫,會(huì)將final方法轉(zhuǎn)為內(nèi)嵌調(diào)用。但是如果方法過(guò)于龐大昔汉,可能看不到內(nèi)嵌調(diào)用帶來(lái)的任何性能提升(現(xiàn)在的Java版本已經(jīng)不需要使用final方法進(jìn)行這些優(yōu)化了)懈万。類中所有的private方法都隱式地指定為fianl。
32 Java 中的異常處理
Java異常類層次結(jié)構(gòu)圖
在 Java 中靶病,所有的異常都有一個(gè)共同的祖先java.lang包中的 Throwable類会通。Throwable: 有兩個(gè)重要的子類:Exception(異常) 和 Error(錯(cuò)誤) ,二者都是 Java 異常處理的重要子類娄周,各自都包含大量子類涕侈。
Error(錯(cuò)誤):是程序無(wú)法處理的錯(cuò)誤,表示運(yùn)行應(yīng)用程序中較嚴(yán)重問(wèn)題。大多數(shù)錯(cuò)誤與代碼編寫者執(zhí)行的操作無(wú)關(guān),而表示代碼運(yùn)行時(shí) JVM(Java 虛擬機(jī))出現(xiàn)的問(wèn)題马昨。例如,Java虛擬機(jī)運(yùn)行錯(cuò)誤(Virtual MachineError)调违,當(dāng) JVM 不再有繼續(xù)執(zhí)行操作所需的內(nèi)存資源時(shí),將出現(xiàn) OutOfMemoryError泻轰。這些異常發(fā)生時(shí)技肩,Java虛擬機(jī)(JVM)一般會(huì)選擇線程終止。
這些錯(cuò)誤表示故障發(fā)生于虛擬機(jī)自身、或者發(fā)生在虛擬機(jī)試圖執(zhí)行應(yīng)用時(shí)虚婿,如Java虛擬機(jī)運(yùn)行錯(cuò)誤(Virtual MachineError)旋奢、類定義錯(cuò)誤(NoClassDefFoundError)等。這些錯(cuò)誤是不可查的然痊,因?yàn)樗鼈冊(cè)趹?yīng)用程序的控制和處理能力之 外至朗,而且絕大多數(shù)是程序運(yùn)行時(shí)不允許出現(xiàn)的狀況。對(duì)于設(shè)計(jì)合理的應(yīng)用程序來(lái)說(shuō)剧浸,即使確實(shí)發(fā)生了錯(cuò)誤锹引,本質(zhì)上也不應(yīng)該試圖去處理它所引起的異常狀況。在 Java中唆香,錯(cuò)誤通過(guò)Error的子類描述嫌变。
Exception(異常):是程序本身可以處理的異常。Exception 類有一個(gè)重要的子類 RuntimeException躬它。RuntimeException 異常由Java虛擬機(jī)拋出腾啥。NullPointerException(要訪問(wèn)的變量沒(méi)有引用任何對(duì)象時(shí),拋出該異常)冯吓、ArithmeticException(算術(shù)運(yùn)算異常倘待,一個(gè)整數(shù)除以0時(shí),拋出該異常)和 ArrayIndexOutOfBoundsException (下標(biāo)越界異常)组贺。
注意:異常和錯(cuò)誤的區(qū)別:異常能被程序本身可以處理凸舵,錯(cuò)誤是無(wú)法處理。
Throwable類常用方法
- public string getMessage():返回異常發(fā)生時(shí)的詳細(xì)信息
- public string toString():返回異常發(fā)生時(shí)的簡(jiǎn)要描述
- public string getLocalizedMessage():返回異常對(duì)象的本地化信息锣披。使用Throwable的子類覆蓋這個(gè)方法贞间,可以聲稱本地化信息贿条。如果子類沒(méi)有覆蓋該方法雹仿,則該方法返回的信息與getMessage()返回的結(jié)果相同
- public void printStackTrace():在控制臺(tái)上打印Throwable對(duì)象封裝的異常信息
異常處理總結(jié)
- try 塊:用于捕獲異常。其后可接零個(gè)或多個(gè)catch塊整以,如果沒(méi)有catch塊胧辽,則必須跟一個(gè)finally塊。
- catch 塊:用于處理try捕獲到的異常公黑。
- finally 塊:無(wú)論是否捕獲或處理異常邑商,finally塊里的語(yǔ)句都會(huì)被執(zhí)行。當(dāng)在try塊或catch塊中遇到return語(yǔ)句時(shí)凡蚜,finally語(yǔ)句塊將在方法返回之前被執(zhí)行人断。
在以下4種特殊情況下,finally塊不會(huì)被執(zhí)行:
- 在finally語(yǔ)句塊中發(fā)生了異常朝蜘。
- 在前面的代碼中用了System.exit()退出程序恶迈。
- 程序所在的線程死亡。
- 關(guān)閉CPU谱醇。
33 Java序列話中如果有些字段不想進(jìn)行序列化 怎么辦
對(duì)于不想進(jìn)行序列化的變量暇仲,使用transient關(guān)鍵字修飾步做。
transient關(guān)鍵字的作用是:阻止實(shí)例中那些用此關(guān)鍵字修飾的的變量序列化;當(dāng)對(duì)象被反序列化時(shí)奈附,被transient修飾的變量值不會(huì)被持久化和恢復(fù)全度。transient只能修飾變量,不能修飾類和方法斥滤。
34 獲取用鍵盤輸入常用的的兩種方法
方法1:通過(guò) Scanner
Scanner input = new Scanner(System.in);
String s = input.nextLine();
input.close();
方法2:通過(guò) BufferedReader
BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
String s = input.readLine();
Java基礎(chǔ)學(xué)習(xí)書籍推薦
《Head First Java.第二版》: 可以說(shuō)是我的 Java 啟蒙書籍了将鸵,特別適合新手讀當(dāng)然也適合我們用來(lái)溫故Java知識(shí)點(diǎn)。
《Java核心技術(shù)卷1+卷2》: 很棒的兩本書佑颇,建議有點(diǎn) Java 基礎(chǔ)之后再讀咨堤,介紹的還是比較深入的,非常推薦漩符。
《Java編程思想(第4版)》: 這本書要常讀一喘,初學(xué)者可以快速概覽,中等程序員可以深入看看 Java嗜暴,老鳥還可以用之回顧 Java 的體系凸克。這本書之所以厲害,因?yàn)樗跓o(wú)形中整合了設(shè)計(jì)模式闷沥,這本書之所以難讀萎战,也恰恰在于他對(duì)設(shè)計(jì)模式的整合是無(wú)形的。