我們在Java入門的時(shí)候,需要了解Java的基礎(chǔ)知識,其中就包含多線程的部分。對于這個(gè)知識點(diǎn),就由粵嵌Java培訓(xùn)解答Java多線程相關(guān)疑問:
一、進(jìn)程和線程的區(qū)別是什么?
進(jìn)程是執(zhí)行著的應(yīng)用程序,而線程是進(jìn)程內(nèi)部的一個(gè)執(zhí)行序列。一個(gè)進(jìn)程可以有多個(gè)線程。線程又叫做輕量級進(jìn)程。
二、創(chuàng)建線程有幾種不同的方式?你喜歡哪一種?為什么?
有三種方式可以用來創(chuàng)建線程:
繼承Thread類;
實(shí)現(xiàn)Runnable接口;
應(yīng)用程序可以使用Executor框架來創(chuàng)建線程池;
實(shí)現(xiàn)Runnable接口這種方式更受歡迎,因?yàn)檫@不需要繼承Thread類。在應(yīng)用設(shè)計(jì)中已經(jīng)繼承了別的對象的情況下,這需要多繼承(而Java不支持多繼承),只能實(shí)現(xiàn)接口。同時(shí),線程池也是非常高效的,很容易實(shí)現(xiàn)和使用。
三、概括的解釋下線程的幾種可用狀態(tài)。
1、新建( new ):新創(chuàng)建了一個(gè)線程對象。
2、可運(yùn)行( runnable ):線程對象創(chuàng)建后,其他線程(比如 main 線程)調(diào)用了該對象 的 start ()方法。該狀態(tài)的線程位于可運(yùn)行線程池中,等待被線程調(diào)度選中,獲 取 cpu 的使用權(quán) 。
3、運(yùn)行( running ):可運(yùn)行狀態(tài)( runnable )的線程獲得了 cpu 時(shí)間片( timeslice ) ,執(zhí)行程序代碼。
4、阻塞( block ):阻塞狀態(tài)是指線程因?yàn)槟撤N原因放棄了 cpu 使用權(quán),也即讓出了 cpu timeslice ,暫時(shí)停止運(yùn)行。直到線程進(jìn)入可運(yùn)行( runnable )狀態(tài),才有 機(jī)會再次獲得 cpu timeslice 轉(zhuǎn)到運(yùn)行( running )狀態(tài)。阻塞的情況分三種:
(一)等待阻塞:運(yùn)行( running )的線程執(zhí)行 o . wait ()方法, JVM 會把該線程放 入等待隊(duì)列( waitting queue )中。
(二)同步阻塞:運(yùn)行( running )的線程在獲取對象的同步鎖時(shí),若該同步鎖 被別的線程占用,則 JVM 會把該線程放入鎖池( lock pool )中。
(三)其他阻塞: 運(yùn)行( running )的線程執(zhí)行 Thread . sleep ( long ms )或 t . join ()方法,或者發(fā)出了 I / O 請求時(shí), JVM 會把該線程置為阻塞狀態(tài)。 當(dāng) sleep ()狀態(tài)超時(shí)、 join ()等待線程終止或者超時(shí)、或者 I / O 處理完畢時(shí),線程重新轉(zhuǎn)入可運(yùn)行( runnable )狀態(tài)。
5、死亡( dead ):線程 run ()、 main () 方法執(zhí)行結(jié)束,或者因異常退出了 run ()方法,則該線程結(jié)束生命周期。死亡的線程不可再次復(fù)生。
懂得了什么是Java多線程,對后續(xù)的學(xué)習(xí)都會有很大的幫助。Java培訓(xùn)不是說僅僅懂得一些定義即可,還需要深入去理解、去編寫代碼才能夠有所提高。如還有疑問,歡迎咨詢粵嵌官網(wǎng)。