小編給大家分享一下Java線程有什么用,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
龍泉驛網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián)建站,龍泉驛網(wǎng)站設(shè)計制作,有大型網(wǎng)站制作公司豐富經(jīng)驗。已為龍泉驛上千多家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\外貿(mào)網(wǎng)站制作要多少錢,請找那個售后服務(wù)好的龍泉驛做網(wǎng)站的公司定做!
一、為什么要研究和使用線程
一般來說,計算機(jī)正在執(zhí)行的程序稱作進(jìn)程(process),進(jìn)程有不同的地址空間并且是在同一系統(tǒng)上運(yùn)行的不同程序,如WORD和Excel,進(jìn)程間的通訊是很費(fèi)時而且有限的。上下文切換、改變運(yùn)行的進(jìn)程也是非常復(fù)雜的。進(jìn)程間通訊復(fù)雜,可能需要管道、消息隊列、共享內(nèi)存 (sharedmemory)或信號處理來保證進(jìn)程間的通訊。盡管許多程序都在運(yùn)行,但一次只能與一個程序打交道。
線程(thread)是指進(jìn)程中單一順序的控制流。又稱為輕量級進(jìn)程。線程則共享相同的地址空間并共同構(gòu)成一個大的進(jìn)程。線程間的通訊是非常簡單而有效的,上下文切換非??觳⑶沂钦麄€大程序的一部分切換。線程僅是過程調(diào)用,它們彼此獨(dú)立執(zhí)行,線程使得在一個應(yīng)用程序中,程序的編寫更加自由和豐富。線程的興趣在于,一個程序中同時使用多個線程來完成不同的任務(wù)。因此如果很好地利用線程,可以大大簡化應(yīng)用程序設(shè)計。多線程可以增進(jìn)程序的交互性,提供更好的能力和功能、更好的GUI和更好的
Dead
Dead表示線程巳退出運(yùn)行狀態(tài),并且不再進(jìn)入就緒隊列.其中原因可能是線程巳執(zhí)行完畢(正常結(jié)束),也可能是該線程被另一線程所強(qiáng)行中斷(kill)。
三、創(chuàng)建和使用線程的基本方法
1.線程的產(chǎn)生
在Java語言中,可采用兩種方式產(chǎn)生線程:一是實現(xiàn)一個Runnable界面,二是擴(kuò)充一個Thread類.java.lang中定義了一個直接從根類Object中派生的Thread類.所有以這個類派生的子類或間接子類,均為線程。在這種方式中,需要作為一個線程執(zhí)行的類只能繼承、擴(kuò)充單一的父類。下面的例子通過擴(kuò)充Thread類,用該線程自己的實現(xiàn)來覆蓋Thread.run(),產(chǎn)生一個新類Counter。run()方法是 Counter類線程所作的全部操作.
import java.lang.*; public class Counter extends Thread { public void run () {....} }
實現(xiàn)Runnable界面是最常用的產(chǎn)生線程的方法,它打破了擴(kuò)充Thread類方式的限制。
Java語言源碼中,Runnable界面只包含了一個抽象方法,其定義如下:
package java.lang.*; public interface Runnable { public abstract void run (); }
所有實現(xiàn)了Runnable界面的類的對象都可以以線程方式執(zhí)行.下面的例子產(chǎn)生與上面例子相同的類.可以看到counter類中使用了一個Thread類的變量.
import java.lang.*;
public class counter implements Runnable { Thread T; public void run () {...} }
2、基本方法
.public synchronized void start()
啟動線程對象,調(diào)用其run()方法,隨即返回。
.pubilc final void stop()
停止線程的執(zhí)行。
.public final void resume()
喚醒被掛起的線程。只在調(diào)用suspend()之后有效。
.public final void suspend()
掛起線程的執(zhí)行。
.public static void yield()
暫時中止當(dāng)前正在執(zhí)行的線程對象的運(yùn)行。若存在其他線程,則隨后調(diào)用下一個線程。
.public static void sleep(longmills)throws Inter rupted Exception
使當(dāng)前正處運(yùn)行狀態(tài)的線程睡眠mills毫秒。
.public final void wait()throws Interrupted Exception
使線程進(jìn)入等待狀態(tài),直到被另一線程喚醒
.public final void motify()
把線程狀態(tài)的變化通知給另一等待線程。
四、線程的同步
線程的使用,主要在于一個進(jìn)程中多個線程的協(xié)同工作,所以線程的同步就很重要。線程的同步用于線程共享數(shù)據(jù),轉(zhuǎn)換和控制線程的執(zhí)行,保證內(nèi)存的一致性。
在Java中,運(yùn)行環(huán)境使用程序(Monitor)來解決線程同步的問題。管程是一種并發(fā)同步機(jī)制,它包括用于分配一個特定的共享資源或一組共享資源的數(shù)據(jù)和方法.
Java為每一個擁有synchronized方法的對象實例提供了一個唯一的管程。為了完成分配資源的功能,線程必須調(diào)用管程入口。管程入口就是synchronized方法入口。當(dāng)調(diào)用同步(synchronized)方法時,該線程就獲得了該管程。
管程邊界上實行嚴(yán)格的互斥,在同一時刻,只允許一個線程進(jìn)入管程;當(dāng)管程中已有了一個線程時,其它希望進(jìn)入管程的線程必須等待,這種等待是由管程自動管理的。
如果調(diào)用管程入口的線程發(fā)現(xiàn)資源已被分配,管程中的這個線程將調(diào)用等待操作wait()。進(jìn)入wait()后,該線程放棄占用管程,在管程外面等待,以便其它線程進(jìn)入管程。
最終,占用資源的線程將調(diào)用一個管程的入口把資源歸還給系統(tǒng),此時,該線程需調(diào)用一個通知操作notify(),通知系統(tǒng)允許其中一個等待的線程獲得管程并得到資源。被通知的線程是排隊的,從而避免無限拖延。
在Java.lang中提供了用來編寫管程的兩個方法:notify()和wait()。此外還有notifyAll(),它通知所有等待的線程,使它們競爭管程,結(jié)果是其中一個獲得管程,其佘返回等待狀態(tài)。
五、線程的控制
線程的控制分為停止線程和啟動線程。
.publicfinalvoidsuspend()
掛起線程的執(zhí)行。
.publicfinalvoidresume()
喚醒被掛起的線程。使一個暫停的線程可用于調(diào)度。
因為線程的調(diào)度為搶占式機(jī)制,也可使用線程的優(yōu)先級來對線程進(jìn)行控制。
.publicfinalvoidsetPriority(intnewPriority)
設(shè)置線程優(yōu)先級。
.publicfinalintgetPriority()
獲取并返回線程的優(yōu)先級。
線程的優(yōu)先級用于在運(yùn)行隊列中給線程排序,Java提供的搶占式調(diào)度,使得高級別的線程先運(yùn)行。
六、線程的應(yīng)用
在實際應(yīng)用中,線程使用的范圍很廣,可用于控制實時數(shù)據(jù)處理、快速的網(wǎng)絡(luò)服務(wù),還有更快的圖象繪制和打印,以及數(shù)據(jù)庫中的數(shù)據(jù)的取回和處理等等。在Java中一個在不停運(yùn)行的提供一些基本服務(wù)的例子是垃圾收集線程,垃圾收集線程,。該線程由Java虛擬機(jī)提供。它掃描程序中不再被訪問的變量,將其所占的系統(tǒng)資源釋放給系統(tǒng)。
以上是“Java線程有什么用”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!