一、并行和并發(fā)有什么區(qū)別?
并行是指兩個或者多個事件在同一時刻發(fā)生;而并發(fā)是指兩個或多個事件在同一時間間隔發(fā)生。
并行是在不同實體上的多個事件,并發(fā)是在同一實體上的多個事件。
并行是在一臺處理器上“同時”處理多個任務(wù),并發(fā)是在多臺處理器上同時處理多個任務(wù)。如hadoop分布式集群。
所以并發(fā)編程的目標(biāo)是充分的利用處理器的每一個核,以達(dá)到最高的處理性能。
(相關(guān)視頻教程推薦:java視頻)
二、線程和進(jìn)程的區(qū)別?
簡而言之,進(jìn)程是程序運行和資源分配的基本單位,一個程序至少有一個進(jìn)程,一個進(jìn)程至少有一個線程。進(jìn)程在執(zhí)行過程中擁有獨立的內(nèi)存單元,而多個線程共享內(nèi)存資源,減少切換次數(shù),從而效率更高。線程是進(jìn)程的一個實體,是cpu調(diào)度和分派的基本單位,是比程序更小的能獨立運行的基本單位。同一進(jìn)程中的多個線程之間可以并發(fā)執(zhí)行。
三、守護(hù)線程是什么?
守護(hù)線程(即daemon thread),是個服務(wù)線程,準(zhǔn)確地來說就是服務(wù)其他的線程。
四、創(chuàng)建線程有哪幾種方式?
(1)繼承Thread類創(chuàng)建線程類
定義Thread類的子類,并重寫該類的run方法,該run方法的方法體就代表了線程要完成的任務(wù)。因此把run()方法稱為執(zhí)行體。
創(chuàng)建Thread子類的實例,即創(chuàng)建了線程對象。
調(diào)用線程對象的start()方法來啟動該線程。
(推薦教程:java入門程序)
(2)通過Runnable接口創(chuàng)建線程類
定義runnable接口的實現(xiàn)類,并重寫該接口的run()方法,該run()方法的方法體同樣是該線程的線程執(zhí)行體。
創(chuàng)建 Runnable實現(xiàn)類的實例,并依此實例作為Thread的target來創(chuàng)建Thread對象,該Thread對象才是真正的線程對象。
調(diào)用線程對象的start()方法來啟動該線程。
(3)通過Callable和Future創(chuàng)建線程
創(chuàng)建Callable接口的實現(xiàn)類,并實現(xiàn)call()方法,該call()方法將作為線程執(zhí)行體,并且有返回值。
創(chuàng)建Callable實現(xiàn)類的實例,使用FutureTask類來包裝Callable對象,該FutureTask對象封裝了該Callable對象的call()方法的返回值。
使用FutureTask對象作為Thread對象的target創(chuàng)建并啟動新線程。
調(diào)用FutureTask對象的get()方法來獲得子線程執(zhí)行結(jié)束后的返回值。
五、說一下 runnable 和 callable 有什么區(qū)別?
有點深的問題了,也看出一個Java程序員學(xué)習(xí)知識的廣度。
Runnable接口中的run()方法的返回值是void,它做的事情只是純粹地去執(zhí)行run()方法中的代碼而已;
Callable接口中的call()方法是有返回值的,是一個泛型,和Future、FutureTask配合可以用來獲取異步執(zhí)行的結(jié)果。
想知道