国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術(shù)文章
文章詳情頁

創(chuàng)建Java中的線程池

瀏覽:2日期:2024-07-01 13:05:39
內(nèi)容: 線程是Java的一大特性,它可以是給定的指令序列、給定的方法中定義的變量或者一些共享數(shù)據(jù)(類一級的變量)。在Java中每個(gè)線程有自己的堆棧和程序計(jì)數(shù)器(PC),其中堆棧是用來跟蹤線程的上下文(上下文是當(dāng)線程執(zhí)行到某處時(shí),當(dāng)前的局部變量的值),而程序計(jì)數(shù)器則用來跟蹤當(dāng)前線程正在執(zhí)行的指令。 在通常情況下,一個(gè)線程不能訪問另外一個(gè)線程的堆棧變量,而且這個(gè)線程必須處于如下狀態(tài)之一: 1.排隊(duì)狀態(tài)(Ready),在用戶創(chuàng)建了一個(gè)線程以后,這個(gè)線程不會(huì)立即運(yùn)行。當(dāng)線程中的方法start()被調(diào)用時(shí),這個(gè)線程就會(huì)進(jìn)行排隊(duì)狀態(tài),等待調(diào)度程序?qū)⑺D(zhuǎn)入運(yùn)行狀態(tài)(Running)。當(dāng)一個(gè)進(jìn)程被執(zhí)行后它也可以進(jìn)行排隊(duì)狀態(tài)。如果調(diào)度程序允許的話,通過調(diào)用方法yield()就可以將進(jìn)程放入排隊(duì)狀態(tài)。 2.運(yùn)行狀態(tài)(Running),當(dāng)調(diào)度程序?qū)PU的運(yùn)行時(shí)間分配給一個(gè)線程,這個(gè)線程就進(jìn)入了運(yùn)行狀態(tài)開始運(yùn)行。 3.等待狀態(tài)(Waiting),很多原因都可以導(dǎo)致線程處于等待狀態(tài),例如線程執(zhí)行過程中被暫停,或者是等待I/O請求的完成而進(jìn)入等待狀態(tài)。 在Java中不同的線程具有不同的優(yōu)先級,高優(yōu)先級的線程可以安排在低優(yōu)先級線程之前完成。如果多個(gè)線程具有相同的優(yōu)先級,Java會(huì)在不同的線程之間切換運(yùn)行。一個(gè)應(yīng)用程序可以通過使用線程中的方法setPriority()來設(shè)置線程的優(yōu)先級,使用方法getPriority()來獲得一個(gè)線程的優(yōu)先級。 線程的生命周期一個(gè)線程的的生命周期可以分成兩階段:生存(Alive)周期和死亡(Dead)周期,其中生存周期又包括運(yùn)行狀態(tài)(Running)和等待狀態(tài)(Waiting)。當(dāng)創(chuàng)建一個(gè)新線程后,這個(gè)線程就進(jìn)入了排隊(duì)狀態(tài)(Ready),當(dāng)線程中的方法start()被調(diào)用時(shí),線程就進(jìn)入生存周期,這時(shí)它的方法isAlive()始終返回真值,直至線程進(jìn)入死亡狀態(tài)。 線程的實(shí)現(xiàn)有兩種方法可以實(shí)現(xiàn)線程,一種是擴(kuò)展java.lang.Thread類,另一種是通過java.lang.Runnable接口。 Thread類封裝了線程的行為。要?jiǎng)?chuàng)建一個(gè)線程,必須創(chuàng)建一個(gè)從Thread類擴(kuò)展出的新類。由于在Thread類中方法run()沒有提供任何的操作,因此,在創(chuàng)建線程時(shí)用戶必須覆蓋方法run()來完成有用的工作。當(dāng)線程中的方法start()被調(diào)用時(shí),方法run()再被調(diào)用。下面的代碼就是通過擴(kuò)展Thread類來實(shí)現(xiàn)線程: import java.awt.*;class Sample1{ public static void main(String[] args){ Mythread test1=new Mythread(1); Mythread test2=new Mythread(2); test1.start(); test2.start(); }}class Mythread extends Thread { int id; Mythread(int i) { id=i;} public void run() { int i=0; while(id+i==1){ try {sleep(1000); } catch(InterruptedException e) {} } System.out.println(“The id is +id);} 通常當(dāng)用戶希望一個(gè)類能運(yùn)行在自己的線程中,同時(shí)也擴(kuò)展其它某些類的特性時(shí),就需要借助運(yùn)行Runnable接口來實(shí)現(xiàn)。Runnable接口只有一個(gè)方法run()。不論什么時(shí)候創(chuàng)建了一個(gè)使用Runnable接口的類,都必須在類中編寫run()方法來覆蓋接口中的run()方法。例如下面的代碼就是通過Runnable接口實(shí)現(xiàn)的線程: import java.awt.*;import java.applet.Applet;public class Bounce extends Applet implements Runnable{ static int r=30; static int x=100; static int y=30; Thread t; public void init() { t = new Thread(this); t.start(); } public void run() { int y1=+1; int i=1; int sleeptime=10; while(true) { y+=(i*y); if(y-rgetSize().height) y1*=-1; try{ t.sleep(sleeptime); }catch(InterruptedException e){ } } }} 為什么要使用線程池在Java中,如果每當(dāng)一個(gè)請求到達(dá)就創(chuàng)建一個(gè)新線程,開銷是相當(dāng)大的。在實(shí)際使用中,每個(gè)請求創(chuàng)建新線程的服務(wù)器在創(chuàng)建和銷毀線程上花費(fèi)的時(shí)間和消耗的系統(tǒng)資源,甚至可能要比花在處理實(shí)際的用戶請求的時(shí)間和資源要多得多。除了創(chuàng)建和銷毀線程的開銷之外,活動(dòng)的線程也需要消耗系統(tǒng)資源。如果在一個(gè)JVM里創(chuàng)建太多的線程,可能會(huì)導(dǎo)致系統(tǒng)由于過度消耗內(nèi)存或“切換過度而導(dǎo)致系統(tǒng)資源不足。為了防止資源不足,服務(wù)器應(yīng)用程序需要一些辦法來限制任何給定時(shí)刻處理的請求數(shù)目,盡可能減少創(chuàng)建和銷毀線程的次數(shù),特別是一些資源耗費(fèi)比較大的線程的創(chuàng)建和銷毀,盡量利用已有對象來進(jìn)行服務(wù),這就是“池化資源技術(shù)產(chǎn)生的原因。 線程池主要用來解決線程生命周期開銷問題和資源不足問題。通過對多個(gè)任務(wù)重用線程,線程創(chuàng)建的開銷就被分?jǐn)偟搅硕鄠€(gè)任務(wù)上了,而且由于在請求到達(dá)時(shí)線程已經(jīng)存在,所以消除了線程創(chuàng)建所帶來的延遲。這樣,就可以立即為請求服務(wù),使應(yīng)用程序響應(yīng)更快。另外,通過適當(dāng)?shù)卣{(diào)整線程池中的線程數(shù)目可以防止出現(xiàn)資源不足的情況。 創(chuàng)建一個(gè)線程池一個(gè)比較簡單的線程池至少應(yīng)包含線程池管理器、工作線程、任務(wù)隊(duì)列、任務(wù)接口等部分。其中線程池管理器(ThreadPool Manager)的作用是創(chuàng)建、銷毀并管理線程池,將工作線程放入線程池中;工作線程是一個(gè)可以循環(huán)執(zhí)行任務(wù)的線程,在沒有任務(wù)時(shí)進(jìn)行等待;任務(wù)隊(duì)列的作用是提供一種緩沖機(jī)制,將沒有處理的任務(wù)放在任務(wù)隊(duì)列中;任務(wù)接口是每個(gè)任務(wù)必須實(shí)現(xiàn)的接口,主要用來規(guī)定任務(wù)的入口、任務(wù)執(zhí)行完后的收尾工作、任務(wù)的執(zhí)行狀態(tài)等,工作線程通過該接口調(diào)度任務(wù)的執(zhí)行。下面的代碼實(shí)現(xiàn)了創(chuàng)建一個(gè)線程池,以及從線程池中取出線程的操作: public class ThreadPool{ private Stack threadpool = new Stack(); private int poolSize; private int currSize=0; public void setSize(int n) { poolSize = n; } public void run() { for(int i=0;i
標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 欧美精品成人一区二区视频一 | 亚洲国产亚洲片在线观看播放 | 国产手机在线国内精品 | 国产亚洲精品线观看77 | 中文字幕成人网 | 欧美日韩在线永久免费播放 | 国产成人精品实拍在线 | 成人在线视频免费观看 | 亚洲欧美一级视频 | 欧美操操操| 精品一区二区三区免费毛片爱 | 久久久高清免费视频 | 国产性色 | 国产性夜夜春夜夜爽30 | 免费a网址 | 性做久久久久久久免费观看 | 亚洲在线欧美 | 黄色三级网站免费 | 久久国产夜色精品噜噜亚洲a | 亚洲视频精品在线 | 国产在线视频一区二区三区 | 特级一级毛片免费看 | 欧美成人另类69 | 日本在线免费观看视频 | 亚洲日本在线观看视频 | 精品无人区一区二区三区a 精品午夜国产在线观看不卡 | 日韩国产三级 | 欧美大尺度xxxxx视频 | 国产精品久久久一区二区三区 | 精品国产v | 色老头一区二区三区在线观看 | 九九国产视频 | 韩国毛片 | 一级片高清 | 成年人国产视频 | 18成人免费观看网站入口 | 成年网站免费视频黄 | 欧洲女同互慰在线视频 | 最近韩国日本免费免费版 | 最新亚洲情黄在线网站无广告 | 爱逼综合网|