Java面試題——36題——快問快答

快問快答Java面試36問!我們從面試來反推Java學(xué)習(xí)。
今天我們來看Java面試題,從大廠夢(mèng)反推基礎(chǔ)學(xué)習(xí)。
面試題:
? ?JDK 和 JRE 有什么區(qū)別?
? ?final 在 java 中有什么作用?
? java 中的 Math.round(-1.5) 等于多少?
?String 屬于基礎(chǔ)的數(shù)據(jù)類型嗎?
java 中操作字符串都有哪些類?它們之間有什么區(qū)別?
String str="i"與 String str=new String("i")一樣嗎?
String 類的常用方法都有那些?
普通類和抽象類有哪些區(qū)別?
接口和抽象類有什么區(qū)別?
java 中 IO 流分為幾種?
BIO、NIO、AIO 有什么區(qū)別?
Files的常用方法都有哪些?
Collection 和 Collections 有什么區(qū)別?
HashMap 和 Hashtable 有什么區(qū)別?
如何決定使用 HashMap 還是 TreeMap?
說一下 HashMap 的實(shí)現(xiàn)原理?
說一下 HashSet 的實(shí)現(xiàn)原理?
ArrayList 和 LinkedList 的區(qū)別是什么?
如何實(shí)現(xiàn)數(shù)組和 List 之間的轉(zhuǎn)換?
ArrayList 和 Vector 的區(qū)別是什么?
Array 和 ArrayList 有何區(qū)別?
在 Queue 中 poll()和 remove()有什么區(qū)別?
哪些集合類是線程安全的?
迭代器 Iterator 是什么?
Iterator 怎么使用?有什么特點(diǎn)?
Iterator 和 ListIterator 有什么區(qū)別?
并行和并發(fā)有什么區(qū)別?
線程和進(jìn)程的區(qū)別?
守護(hù)線程是什么?
創(chuàng)建線程有哪幾種方式?
說一下 runnable 和 callable 有什么區(qū)別?
線程有哪些狀態(tài)?
sleep() 和 wait() 有什么區(qū)別?
notify()和 notifyAll()有什么區(qū)別?
線程的 run()和 start()有什么區(qū)別?
創(chuàng)建線程池有哪幾種方式?

1. JDK 和 JRE 有什么區(qū)別?
?JDK:Java Development Kit 的簡(jiǎn)稱,java 開發(fā)工具包,提供了 java 的開發(fā)環(huán)境和運(yùn)行環(huán)境。
?JRE:Java Runtime Environment 的簡(jiǎn)稱,java 運(yùn)行環(huán)境,為 java 的運(yùn)行提供了所需環(huán)境。
? ? ? ? JDK 包含了 JRE,同時(shí)還包含了編譯 Java 源碼的編譯器 Javac和許多Java 程序調(diào)試和分析的工具。
? ? ? ?如果需要運(yùn)行 Java ,只需安裝 JRE 即可,如果你需要編寫 Java 程序,需要安裝 JDK。
2. final 在 Java 中有什么作用?
final 修飾的類叫最終類,該類不能被繼承。
final 修飾的方法不能被重寫。
final 修飾的變量叫常量,而常量必須初始化,初始化之后值便不能被修改。
3. Java 中的 Math.round(-1.5) 等于多少?
? ? ? ?等于 -1,在數(shù)軸上取值時(shí),中間值(0.5)向右取整;正 0.5 是往上取整,負(fù) 0.5 是直接舍棄。
4. String 屬于基礎(chǔ)的數(shù)據(jù)類型嗎?
? ? ? ?String 不屬于基礎(chǔ)類型.
? ? ? ?基礎(chǔ)類型有 8 種:byte、boolean、char、short、int、float、long、double,String 屬于對(duì)象。
5.Java 中操作字符串都有哪些類?它們之間有什么區(qū)別?
操作字符串的類有:String、StringBuffer、StringBuilder。
? ? ? ?String 和 StringBuffer、StringBuilder 的區(qū)別在于 String 聲明的是不可變的對(duì)象,每次操作都會(huì)生成新的 String 對(duì)象,然后將指針指向新的 String 對(duì)象,而 StringBuffer、StringBuilder 可以在原有對(duì)象的基礎(chǔ)上進(jìn)行操作,所以在經(jīng)常改變字符串內(nèi)容的情況下最好不要使用 String。
? ? ? ?StringBuffer 和 StringBuilder 最大的區(qū)別在于,StringBuffer 是線程安全的,而 StringBuilder 是非線程安全的,但 StringBuilder 的性能卻高于 StringBuffer,所以在單線程環(huán)境下推薦使用 StringBuilder,多線程環(huán)境下推薦使用 StringBuffer。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ?6. String str="i"與 String str=new String("i")一樣嗎?
? ? ? ?不一樣。
? ? ? ?內(nèi)存的分配方式不一樣。String str="i"的方式,java 虛擬機(jī)會(huì)將其分配到常量池中;而 String str=new String("i") 則會(huì)被分到堆內(nèi)存中。
7. String 類的常用方法都有那些?
indexOf():返回指定字符的索引。
charAt():返回指定索引處的字符。
replace():字符串替換。
trim():去除字符串兩端空白。
split():分割字符串,返回一個(gè)分割后的字符串?dāng)?shù)組。
getBytes():返回字符串的 byte 類型數(shù)組。
length():返回字符串長(zhǎng)度。
toLowerCase():將字符串轉(zhuǎn)成小寫字母。
toUpperCase():將字符串轉(zhuǎn)成大寫字符。
substring():截取字符串。
equals():字符串比較。
8. 普通類和抽象類有哪些區(qū)別?
? ? ? ?普通類不能包含抽象方法,抽象類可以包含抽象方法。
? ? ? ?抽象類不能直接實(shí)例化,普通類可以直接實(shí)例化。
9. 接口和抽象類有什么區(qū)別?
實(shí)現(xiàn):抽象類的子類使用 extends 來繼承;接口必須使用 implements 來實(shí)現(xiàn)接口。
構(gòu)造函數(shù):抽象類可以有構(gòu)造函數(shù);接口不能有。
main 方法:抽象類可以有 main 方法,并且我們能運(yùn)行它;接口不能有 main 方法。
實(shí)現(xiàn)數(shù)量:類可以實(shí)現(xiàn)很多個(gè)接口;但是只能繼承一個(gè)抽象類。
訪問修飾符:接口中的方法默認(rèn)使用 public 修飾;抽象類中的方法可以是任意訪問修飾符。
10. Java 中 IO 流分為幾種?
功能:輸入流(input)、輸出流(output)。
類型:字節(jié)流和字符流。
字節(jié)流與字符流的區(qū)別:
? ? ? ?字節(jié)流按 8 位傳輸以字節(jié)為單位輸入輸出數(shù)據(jù),字符流按 16 位傳輸以字符為單位輸入輸出數(shù)據(jù)。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
11. BIO、NIO、AIO 有什么區(qū)別?
?BIO:Block IO 同步阻塞式 IO,就是我們平常使用的傳統(tǒng) IO,它的特點(diǎn)是模式簡(jiǎn)單使用方便,并發(fā)處理能力低。
?NIO:New IO 同步非阻塞 IO,是傳統(tǒng) IO 的升級(jí),客戶端和服務(wù)器端通過 Channel(通道)通訊,實(shí)現(xiàn)了多路復(fù)用。
?AIO:Asynchronous IO 是 NIO 的升級(jí),也叫 NIO2,實(shí)現(xiàn)了異步非堵塞 IO ,異步 IO 的操作基于事件和回調(diào)機(jī)制。
12. Files的常用方法都有哪些?
Files.exists():檢測(cè)文件路徑是否存在。
Files.createFile():創(chuàng)建文件。
Files.createDirectory():創(chuàng)建文件夾。
Files.delete():刪除一個(gè)文件或目錄。
Files.copy():復(fù)制文件。
Files.move():移動(dòng)文件。
Files.size():查看文件個(gè)數(shù)。
Files.read():讀取文件。
Files.write():寫入文件。
13. Collection 和 Collections 有什么區(qū)別?
? ? ? ?Java.util.Collection 是一個(gè)集合接口,集合類的一個(gè)頂級(jí)接口。它提供了對(duì)集合對(duì)象進(jìn)行基本操作的通用接口方法。Collection接口在Java 類庫(kù)中有很多具體的實(shí)現(xiàn)。Collection接口的意義是為各種具體的集合提供了最大化的統(tǒng)一操作方式,其直接繼承接口有List與Set。
? ? ? ?Collections則是集合類的一個(gè)工具類/幫助類,其中提供了一系列靜態(tài)方法,用于對(duì)集合中元素進(jìn)行排序、搜索以及線程安全等各種操作。
14. HashMap 和 Hashtable 有什么區(qū)別?
?HashMap去掉了HashTable 的contains方法,補(bǔ)充添加了containsValue()和containsKey()方法。
?HashTable可以同步,HashMap是非同步。
?HashMap允許空鍵值,而HashTable不允許。
15. 如何決定使用 HashMap 還是 TreeMap?
? ? ? ?對(duì)于在Map中插入、刪除和定位元素這類操作,HashMap是最好的選擇。
? ? ? ?對(duì)一個(gè)有序的key集合進(jìn)行遍歷,TreeMap是更好的選擇。
? ? ? ?基于你的collection的大小,也許向HashMap中添加元素會(huì)更快,將map換為TreeMap進(jìn)行有序key的遍歷。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
16. 說一下 HashMap 的實(shí)現(xiàn)原理?
? ? ? ?HashMap概述: HashMap是基于哈希表的Map接口的非同步實(shí)現(xiàn)。此實(shí)現(xiàn)提供所有可選的映射操作,并允許使用null值和null鍵。此類不保證映射的順序,特別是它不保證該順序恒久不變。
? ? ? ?HashMap的數(shù)據(jù)結(jié)構(gòu): 在Java編程語言中,最基本的結(jié)構(gòu)就是兩種,一個(gè)是數(shù)組,另外一個(gè)是模擬指針(引用),所有的數(shù)據(jù)結(jié)構(gòu)都可以用這兩個(gè)基本結(jié)構(gòu)來構(gòu)造的,HashMap也不例外。HashMap實(shí)際上是一個(gè)“鏈表散列”的數(shù)據(jù)結(jié)構(gòu),即數(shù)組和鏈表的結(jié)合體。
? ? ? ?當(dāng)我們往Hashmap中put元素時(shí),首先根據(jù)key的hashcode重新計(jì)算hash值,根絕hash值得到這個(gè)元素在數(shù)組中的位置(下標(biāo)),如果該數(shù)組在該位置上已經(jīng)存放了其他元素,那么在這個(gè)位置上的元素將以鏈表的形式存放,新加入的放在鏈頭,最先加入的放入鏈尾.如果數(shù)組中該位置沒有元素,就直接將該元素放到數(shù)組的該位置上。
? ? ? ?JDK 1.8中對(duì)HashMap的實(shí)現(xiàn)做了優(yōu)化,當(dāng)鏈表中的節(jié)點(diǎn)數(shù)據(jù)超過八個(gè)之后,該鏈表會(huì)轉(zhuǎn)為紅黑樹來提高查詢效率,從原來的O(n)到O(logn)
17. 說一下 HashSet 的實(shí)現(xiàn)原理?
?HashSet底層由HashMap實(shí)現(xiàn)
?HashSet的值存放于HashMap的key上
?HashMap的value統(tǒng)一為PRESENT
18. ArrayList 和 LinkedList 的區(qū)別是什么?
? ? ? ??ArrrayList底層的數(shù)據(jù)結(jié)構(gòu)是數(shù)組,支持隨機(jī)訪問;?LinkedList 的底層數(shù)據(jù)結(jié)構(gòu)是雙向循環(huán)鏈表,不支持隨機(jī)訪問。
? ? ? ?使用下標(biāo)訪問一個(gè)元素,ArrayList 的時(shí)間復(fù)雜度是 O(1),而 LinkedList 是 O(n)。
19. 如何實(shí)現(xiàn)數(shù)組和 List 之間的轉(zhuǎn)換?
?List轉(zhuǎn)換成為數(shù)組:調(diào)用ArrayList的toArray方法。
?數(shù)組轉(zhuǎn)換成為L(zhǎng)ist:調(diào)用Arrays的asList方法。
20. ArrayList 和 Vector 的區(qū)別是什么?
? ? ? ?1:Vector是同步的,而ArrayList不是。如果尋求在迭代的時(shí)候?qū)α斜磉M(jìn)行改變,應(yīng)該使用CopyOnWriteArrayList。
? ? ? ?2:ArrayList因?yàn)橛型奖萔ector快,不會(huì)過載。
? ? ? ?3: ArrayList更加通用,因?yàn)槲覀兛梢允褂肅ollections工具類輕易地獲取同步列表和只讀列表。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
21. Array 和 ArrayList 有何區(qū)別?
? ? ? ?1:Array可以容納基本類型和對(duì)象,而ArrayList只能容納對(duì)象。
? ? ? ?2: Array是指定大小的,而ArrayList大小是固定的。
? ? ? ?3:Array沒有提供ArrayList那么多功能,比如addAll、removeAll和iterator等。
22. 在 Queue 中 poll()和 remove()有什么區(qū)別?
? ? ? ? poll() 和 remove() 都是從隊(duì)列中取出一個(gè)元素, poll() 在獲取元素失敗的時(shí)候會(huì)返回空, remove() 失敗的時(shí)候會(huì)拋出異常。
23. 哪些集合類是線程安全的?
?vector:就比arraylist多了個(gè)同步化機(jī)制(線程安全),因?yàn)樾瘦^低,現(xiàn)在已經(jīng)不太建議使用。在web應(yīng)用中,特別是前臺(tái)頁面,往往效率(頁面響應(yīng)速度)是優(yōu)先考慮的。
?statck:堆棧類,先進(jìn)后出。
?hashtable:就比hashmap多了個(gè)線程安全。
?enumeration:枚舉,相當(dāng)于迭代器。
24. 迭代器 Iterator 是什么?
? ? ? ? 迭代器是一種設(shè)計(jì)模式,它是一個(gè)對(duì)象,它可以遍歷并選擇序列中的對(duì)象。迭代器因?yàn)閯?chuàng)建它的代價(jià)小通常被稱為“輕量級(jí)”對(duì)象。
25. Iterator 怎么使用?有什么特點(diǎn)?
Java中的Iterator功能比較簡(jiǎn)單,并且只能單向移動(dòng):
1:使用方法:iterator()要求容器返回一個(gè)Iterator。第一次調(diào)用Iterator的next()方法時(shí),它返回序列的第一個(gè)元素。(iterator()方法是java.lang.Iterable接口,被Collection繼承。)
2: 使用next()獲得序列中的下一個(gè)元素。
3:使用hasNext()檢查序列中是否還有元素。
4:使用remove()將迭代器新返回的元素刪除。
5:Iterator是Java迭代器最簡(jiǎn)單的實(shí)現(xiàn),為L(zhǎng)ist設(shè)計(jì)的ListIterator具有更多的功能,它可以從兩個(gè)方向遍歷List,也可以從List中插入和刪除元素。
? 26. Iterator 和 ListIterator 有什么區(qū)別?
?Iterator可用來遍歷Set和List集合,但是ListIterator只能用來遍歷List。
?Iterator對(duì)集合只能是前向遍歷,ListIterator既可以前向也可以后向。
?ListIterator實(shí)現(xiàn)了Iterator接口,并包含其他的功能,如:增加元素獲取前一個(gè)和后一個(gè)元素的索引等。
27. 并行和并發(fā)有什么區(qū)別?
?并行是指兩個(gè)或者多個(gè)事件在同一時(shí)刻發(fā)生;而并發(fā)是指兩個(gè)或多個(gè)事件在同一時(shí)間間隔發(fā)生。
?并行是在不同實(shí)體上的多個(gè)事件,并發(fā)是在同一實(shí)體上的多個(gè)事件。
?在一臺(tái)處理器上“同時(shí)”處理多個(gè)任務(wù),在多臺(tái)處理器上同時(shí)處理多個(gè)任務(wù)。如hadoop分布式集群。
? ? ? ? 并發(fā)編程的目標(biāo)是充分的利用處理器的每一個(gè)核,以達(dá)到最高的處理性能。
28. 線程和進(jìn)程的區(qū)別?
? ? ? ? 進(jìn)程是程序運(yùn)行和資源分配的基本單位,一個(gè)程序至少有一個(gè)進(jìn)程,一個(gè)進(jìn)程至少有一個(gè)線程。進(jìn)程在執(zhí)行過程中擁有獨(dú)立的內(nèi)存單元,而多個(gè)線程共享內(nèi)存資源,減少切換次數(shù),從而效率更高。
? ? ? ? 線程是進(jìn)程的一個(gè)實(shí)體,是cpu調(diào)度和分派的基本單位,是比程序更小的能獨(dú)立運(yùn)行的基本單位。同一進(jìn)程中的多個(gè)線程之間可以并發(fā)執(zhí)行。
29. 守護(hù)線程是什么?
? ? ? ? 守護(hù)線程(即daemon thread),是個(gè)服務(wù)線程,簡(jiǎn)單來說也就是服務(wù)其他的線程。
30. 創(chuàng)建線程有哪幾種方式?
1:繼承Thread類創(chuàng)建線程類
定義Thread類的子類,并重寫該類的run方法,該run方法的方法體就代表了線程要完成的任務(wù)。因此把run()方法稱為執(zhí)行體。
創(chuàng)建Thread子類的實(shí)例,即創(chuàng)建了線程對(duì)象。
調(diào)用線程對(duì)象的start()方法來啟動(dòng)該線程。
2:通過Runnable接口創(chuàng)建線程類
定義runnable接口的實(shí)現(xiàn)類,并重寫該接口的run()方法,該run()方法的方法體同樣是該線程的線程執(zhí)行體。
創(chuàng)建 Runnable實(shí)現(xiàn)類的實(shí)例,并依此實(shí)例作為Thread的target來創(chuàng)建Thread對(duì)象,該Thread對(duì)象才是真正的線程對(duì)象。
調(diào)用線程對(duì)象的start()方法來啟動(dòng)該線程。
3:通過Callable和Future創(chuàng)建線程
創(chuàng)建Callable接口的實(shí)現(xiàn)類,并實(shí)現(xiàn)call()方法,該call()方法將作為線程執(zhí)行體,并且有返回值。
創(chuàng)建Callable實(shí)現(xiàn)類的實(shí)例,使用FutureTask類來包裝Callable對(duì)象,該FutureTask對(duì)象封裝了該Callable對(duì)象的call()方法的返回值。
使用FutureTask對(duì)象作為Thread對(duì)象的target創(chuàng)建并啟動(dòng)新線程。
調(diào)用FutureTask對(duì)象的get()方法來獲得子線程執(zhí)行結(jié)束后的返回? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
31. 說一下 Runnable 和 Callable 有什么區(qū)別?
?Callable接口中的call()方法是有返回值的,是一個(gè)泛型,和Future、FutureTask配合可以用來獲取異步執(zhí)行的結(jié)果。
32. 線程有哪些狀態(tài)?
線程通常都有五種狀態(tài),創(chuàng)建、就緒、運(yùn)行、阻塞和死亡。
1:創(chuàng)建狀態(tài)。在生成線程對(duì)象,并沒有調(diào)用該對(duì)象的start方法,這是線程處于創(chuàng)建狀態(tài)。
2:就緒狀態(tài)。當(dāng)調(diào)用了線程對(duì)象的start方法之后,該線程就進(jìn)入了就緒狀態(tài),但是此時(shí)線程調(diào)度程序還沒有把該線程設(shè)置為當(dāng)前線程,此時(shí)處于就緒狀態(tài)。在線程運(yùn)行之后,從等待或者睡眠中回來之后,也會(huì)處于就緒狀態(tài)。
3:運(yùn)行狀態(tài)。線程調(diào)度程序?qū)⑻幱诰途w狀態(tài)的線程設(shè)置為當(dāng)前線程,此時(shí)線程就進(jìn)入了運(yùn)行狀態(tài),開始運(yùn)行run函數(shù)當(dāng)中的代碼。
4:阻塞狀態(tài)。線程正在運(yùn)行的時(shí)候,被暫停,通常是為了等待某個(gè)時(shí)間的發(fā)生(比如說某項(xiàng)資源就緒)之后再繼續(xù)運(yùn)行。sleep,suspend,wait等方法都可以導(dǎo)致線程阻塞。
5:死亡狀態(tài)。如果一個(gè)線程的run方法執(zhí)行結(jié)束或者調(diào)用stop方法后,該線程就會(huì)死亡。對(duì)于已經(jīng)死亡的線程,無法再使用start方法令其進(jìn)入就緒
33. sleep() 和 wait() 有什么區(qū)別?
? ? ? ? sleep():方法是線程類(Thread)的靜態(tài)方法,讓調(diào)用線程進(jìn)入睡眠狀態(tài),讓出執(zhí)行機(jī)會(huì)給其他線程,等到休眠時(shí)間結(jié)束后,線程進(jìn)入就緒狀態(tài)和其他線程一起競(jìng)爭(zhēng)cpu的執(zhí)行時(shí)間。因?yàn)閟leep() 是static靜態(tài)的方法,他不能改變對(duì)象的機(jī)鎖,當(dāng)一個(gè)synchronized塊中調(diào)用了sleep() 方法,線程雖然進(jìn)入休眠,但是對(duì)象的機(jī)鎖沒有被釋放,其他線程依然無法訪問這個(gè)對(duì)象。
? ? ? ? wait():wait()是Object類的方法,當(dāng)一個(gè)線程執(zhí)行到wait方法時(shí),它就進(jìn)入到一個(gè)和該對(duì)象相關(guān)的等待池,同時(shí)釋放對(duì)象的機(jī)鎖,使得其他線程能夠訪問,可以通過notify,notifyAll方法來喚醒等待的線程。
34. notify()和 notifyAll()有什么區(qū)別?
?如果線程調(diào)用了對(duì)象的 wait()方法,那么線程便會(huì)處于該對(duì)象的等待池中,等待池中的線程不會(huì)去競(jìng)爭(zhēng)該對(duì)象的鎖。
?當(dāng)有線程調(diào)用了對(duì)象的 notifyAll()方法(喚醒所有 wait 線程)或 notify()方法(只隨機(jī)喚醒一個(gè) wait 線程),被喚醒的的線程便會(huì)進(jìn)入該對(duì)象的鎖池中,鎖池中的線程會(huì)去競(jìng)爭(zhēng)該對(duì)象鎖。也就是說,調(diào)用了notify后只要一個(gè)線程會(huì)由等待池進(jìn)入鎖池,而notifyAll會(huì)將該對(duì)象等待池內(nèi)的所有線程移動(dòng)到鎖池中,等待鎖競(jìng)爭(zhēng)。
?優(yōu)先級(jí)高的線程競(jìng)爭(zhēng)到對(duì)象鎖的概率大,假若某線程沒有競(jìng)爭(zhēng)到該對(duì)象鎖,它還會(huì)留在鎖池中,唯有線程再次調(diào)用 wait()方法,它才會(huì)重新回到等待池中。而競(jìng)爭(zhēng)到對(duì)象鎖的線程則繼續(xù)往下執(zhí)行,直到執(zhí)行完了 synchronized 代碼塊,它會(huì)釋放掉該對(duì)象鎖,這時(shí)鎖池中的線程會(huì)繼續(xù)競(jìng)爭(zhēng)該對(duì)象鎖。
35. 線程的 run()和 start()有什么區(qū)別?
? ? ? ? 每個(gè)線程都是通過某個(gè)特定Thread對(duì)象所對(duì)應(yīng)的方法run()來完成其操作的,方法run()稱為線程體。通過調(diào)用Thread類的start()方法來啟動(dòng)一個(gè)線程。
? ? ? ? start()方法來啟動(dòng)一個(gè)線程,真正實(shí)現(xiàn)了多線程運(yùn)行。這時(shí)無需等待run方法體代碼執(zhí)行完畢,可以直接繼續(xù)執(zhí)行下面的代碼; 這時(shí)此線程是處于就緒狀態(tài), 并沒有運(yùn)行。 然后通過此Thread類調(diào)用方法run()來完成其運(yùn)行狀態(tài), 這里方法run()稱為線程體,它包含了要執(zhí)行的這個(gè)線程的內(nèi)容, Run方法運(yùn)行結(jié)束, 此線程終止。然后CPU再調(diào)度其它線程。
? ? ? ? run()方法是在本線程里的,只是線程里的一個(gè)函數(shù),而不是多線程的。 如果直接調(diào)用run(),其實(shí)就相當(dāng)于是調(diào)用了一個(gè)普通函數(shù)而已,直接待用run()方法必須等待run()方法執(zhí)行完畢才能執(zhí)行下面的代碼,所以執(zhí)行路徑還是只有一條,根本就沒有線程的特征,所以在多線程執(zhí)行時(shí)要使用start()方法而不是run()方法。
36. 創(chuàng)建線程池有哪幾種方式?
1: newFixedThreadPool(int nThreads)
創(chuàng)建一個(gè)固定長(zhǎng)度的線程池,每當(dāng)提交一個(gè)任務(wù)就創(chuàng)建一個(gè)線程,直到達(dá)到線程池的最大數(shù)量,這時(shí)線程規(guī)模將不再變化,當(dāng)線程發(fā)生未預(yù)期的錯(cuò)誤而結(jié)束時(shí),線程池會(huì)補(bǔ)充一個(gè)新的線程。
2:newCachedThreadPool()
創(chuàng)建一個(gè)可緩存的線程池,如果線程池的規(guī)模超過了處理需求,將自動(dòng)回收空閑線程,而當(dāng)需求增加時(shí),則可以自動(dòng)添加新線程,線程池的規(guī)模不存在任何限制。
3: newSingleThreadExecutor()
這是一個(gè)單線程的Executor,它創(chuàng)建單個(gè)工作線程來執(zhí)行任務(wù),如果這個(gè)線程異常結(jié)束,會(huì)創(chuàng)建一個(gè)新的來替代它;它的特點(diǎn)是能確保依照任務(wù)在隊(duì)列中的順序來串行執(zhí)行。
4:newScheduledThreadPool(int corePoolSize)
創(chuàng)建了一個(gè)固定長(zhǎng)度的線程池,而且以延遲或定時(shí)的方式來執(zhí)行任務(wù),類似于Timer。
這就是今天的快問快答了,還有什么需求請(qǐng)少俠盡快告訴我,我們一起努力向前!
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

? ? ? ? ? ? ? ? ? ?