更新時間:2021-06-23 12:52:10 來源:動力節(jié)點(diǎn) 瀏覽1613次
基本概念
多任務(wù):同一時刻運(yùn)行多個程序的能力。每一個任務(wù)稱為一個線程??梢酝瑫r運(yùn)行一個以上線程的程序稱為多線程編程。
Java編寫程序都運(yùn)行在Java虛擬機(jī)(JVM)中,在JVM的內(nèi)部,程序的多任務(wù)是通過線程來實現(xiàn)的。每用java命令啟動一個java應(yīng)用程序,就會啟動一個JVM進(jìn)程。在同一個JVM進(jìn)程中,有且只有一個進(jìn)程,就是它自己。在這個JVM環(huán)境中,所有程序代碼的運(yùn)行都是以線程來運(yùn)行。
一般常見的Java應(yīng)用程序都是單線程的。比如,用java命令運(yùn)行一個最簡單的HelloWorld的Java應(yīng)用程序時,就啟動了一個JVM進(jìn)程,JVM找到程序程序的入口點(diǎn)main(),然后運(yùn)行main()方法,這樣就產(chǎn)生了一個線程,這個線程稱之為主線程。當(dāng)main方法結(jié)束后,主線程運(yùn)行完成。JVM進(jìn)程也隨即退出 。
對于一個進(jìn)程中的多個線程來說,多個線程共享進(jìn)程的內(nèi)存塊,當(dāng)有新的線程產(chǎn)生的時候,操作系統(tǒng)不分配新的內(nèi)存,而是讓新線程共享原有的進(jìn)程塊的內(nèi)存。因此,線程間的通信很容易,速度也很快。不同的進(jìn)程因為處于不同的內(nèi)存塊,因此進(jìn)程之間的通信相對困難。
進(jìn)程是指一個內(nèi)存中運(yùn)行的應(yīng)用程序,每個進(jìn)程都有自己獨(dú)立的一塊內(nèi)存空間,一個進(jìn)程中可以啟動多個線程。比如在Windows系統(tǒng)中,一個運(yùn)行的exe就是一個進(jìn)程。
線程是指進(jìn)程中的一個執(zhí)行流程,一個進(jìn)程可以運(yùn)行多個線程。比如java.exe進(jìn)程可以運(yùn)行很多線程。線程總是輸入某個進(jìn)程,進(jìn)程中的多個線程共享進(jìn)程的內(nèi)存。
Java中線程是指java.lang.Thread類的一個實例或線程的執(zhí)行。使用java.lang.Thread或java.lang.Runnable接口編寫代碼定義、實例化、啟動新線程。
Java中每個線程都有一個調(diào)用棧,即使不在程序中創(chuàng)建任何新的線程,線程也在后臺運(yùn)行。main()方法運(yùn)行在一個線程內(nèi),稱為主線程。一旦創(chuàng)建一個新的線程,就產(chǎn)生一個新的調(diào)用棧。
線程分為兩類:用戶線程和守候線程。當(dāng)所有用戶線程執(zhí)行完畢后,JVM自動關(guān)閉。但是守候線程卻不獨(dú)立與JVM,守候線程一般是有操作系統(tǒng)或用戶自己創(chuàng)建的。
定義線程
1.擴(kuò)展java.lang.Thread類以及實現(xiàn)java.lang.Runnable接口。
此類中有run()方法,public void run(),如果該線程是獨(dú)立的Runnable運(yùn)行對象構(gòu)造的,則調(diào)用該Runnable對象的run()方法;否則,該方法不執(zhí)行任何操作。Thread的子類也應(yīng)該重寫該方法。
實例化線程
1.如果是擴(kuò)展了java.lang.Thread類的線程,則直接調(diào)用new即可。
2.如果是實現(xiàn)了jav.lang.Runnable接口的類,則調(diào)用Thread的構(gòu)造方法:
Thread(Runnable target)
Thread(Runnable target,String name)
Thread(ThreadGroup group, Runnable target)
Thread(ThreadGroup group, Runnable target, String name)
Thread(ThreadGroup group, Runnable target, String name, long stackSize)
啟動線程
在線程的Thread對象上調(diào)用start()方法,而不是run()或別的方法。
在調(diào)用start()方法之前,線程處于新狀態(tài)中,新狀態(tài)有一個Thread對象,但沒有一個真正的線程。
在調(diào)用start()方法之后,發(fā)生了一系列復(fù)雜的事情:
啟動新的執(zhí)行線程(具有新的調(diào)用棧);
該線程從新狀態(tài)轉(zhuǎn)移到可運(yùn)行狀態(tài);
當(dāng)該線程獲得執(zhí)行機(jī)會時,其目標(biāo)run()方法將運(yùn)行。
注意事項
1.獲取當(dāng)前線程的對象的方法是:Thread.currentThread();
2.當(dāng)線程目標(biāo)run()方法結(jié)束時該線程完成。
3.一旦線程啟動,它就永遠(yuǎn)不能再重新啟動。只有一個新的線程可以被啟動,并且只能一次。一個可運(yùn)行的線程或死線程可以被重新啟動。
4.線程的調(diào)度是JVM的一部分,在一個CPU的機(jī)器上上,實際上一次只能運(yùn)行一個線程。一次只有一個線程棧執(zhí)行。JVM線程調(diào)度程序決定實際運(yùn)行哪個處于可運(yùn)行狀態(tài)的線程。眾多可運(yùn)行線程中的某一個會被選中做為當(dāng)前線程??蛇\(yùn)行線程被選擇運(yùn)行的順序是沒有保障的。
5.盡管通常采用隊列形式,但這是沒有保障的。隊列形式是指當(dāng)一個線程完成“一輪”時,它移到可運(yùn)行隊列的尾部等待,直到它最終排隊到該隊列的前端為止,它才能被再次選中。事實上,我們把它稱為可運(yùn)行池而不是一個可運(yùn)行隊列,目的是幫助認(rèn)識線程并不都是以某種有保障的順序排列一個隊列的事實。
6.盡管我們沒有無法控制線程調(diào)度程序,但可以通過別的方式來影響線程調(diào)度的方式。
以上就是動力節(jié)點(diǎn)小編介紹的"線程的基本概念",希望對大家有幫助,想了解更多可查看Java多線程編程技術(shù)文檔,如有疑問,請在線咨詢,有專業(yè)老師隨時為您服務(wù)。

初級 202925

初級 203221

初級 202629

初級 203743