JAVA線程池介紹以及簡單實(shí)例_第1頁
JAVA線程池介紹以及簡單實(shí)例_第2頁
已閱讀5頁,還剩5頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、 10/10JAVA線程池介紹以及簡單實(shí)例 JAVA線程池介紹以及簡單實(shí)例 文章分類:Java編程 在什么情況下使用線程池? 1.單個(gè)任務(wù)處理的時(shí)間比較短 2.將需處理的任務(wù)的數(shù)量大 使用線程池的好處: 1.減少在創(chuàng)建和銷毀線程上所花的時(shí)間以及系統(tǒng)資源的開銷 2.如不使用線程池,有可能造成系統(tǒng)創(chuàng)建大量線程而導(dǎo)致消耗完系統(tǒng)內(nèi)存以及”過度切換”。 線程池工作原理: http:/./doc/e4543a7a5acfa1c7aa00cc25.html /developerworks/cn/java/j-jtp0730/ 該文章里有個(gè)例子,簡單的描述了線程池的內(nèi)部實(shí)現(xiàn),建議根據(jù)里面的例子來了解JAVA

2、線程池的原理。同時(shí),里面還詳細(xì)描述了使用線程池存在的優(yōu)點(diǎn)和弊端,大家可以研究下,我覺得是篇非常好的文章。 JDK自帶線程池總類介紹介紹: 1、newFixedThreadPool創(chuàng)建一個(gè)指定工作線程數(shù)量的線程池。每當(dāng)提交一個(gè)任務(wù)就創(chuàng)建一個(gè)工作線程,如果工作線程數(shù)量達(dá)到線程池初始的最大數(shù),則將提交的任務(wù)存入到池隊(duì)列中。 2、newCachedThreadPool創(chuàng)建一個(gè)可緩存的線程池。這種類型的線程池特點(diǎn)是: 1).工作線程的創(chuàng)建數(shù)量幾乎沒有限制(其實(shí)也有限制的,數(shù)目為Interger. MAX_VALUE), 這樣可靈活的往線程池中添加線程。 2).如果長時(shí)間沒有往線程池中提交任務(wù),即如果工作

3、線程空閑了指定的時(shí)間(默認(rèn)為1分鐘),則該工作線程將自動(dòng)終止。終止后,如果你又提交了新的任務(wù),則線程池重新創(chuàng)建一個(gè)工作線程。 3、newSingleThreadExecutor創(chuàng)建一個(gè)單線程化的Executor,即只創(chuàng)建唯一的工線程來執(zhí)行任務(wù),如果這個(gè)線程異常結(jié)束,會(huì)有另一個(gè)取代它,保證順序執(zhí)行(我覺得這點(diǎn)是它的特色)。單工作線程最大的特點(diǎn)是可保證順序地執(zhí)行各個(gè)任務(wù),并且在任意給定的時(shí)間不會(huì)有多個(gè)線程是活動(dòng)的。 4、newScheduleThreadPool創(chuàng)建一個(gè)定長的線程池,而且支持定時(shí)的以及周期性的任務(wù)執(zhí)行,類似于Timer。(這種線程池原理暫還沒完全 了解透徹) 總結(jié):一.FixedT

4、hreadPool是一個(gè)典型且優(yōu)秀的線程池,它具有線程池提高程序效率和節(jié)省創(chuàng)建線程時(shí)所耗的開銷的優(yōu)點(diǎn)。但是,在線程池空閑時(shí),即線程池中沒有可運(yùn)行任務(wù)時(shí),它不會(huì)釋放工作線程,還會(huì)占用一定的系統(tǒng)資源。 二CachedThreadPool的特點(diǎn)就是在線程池空閑時(shí),即線程池中沒有可運(yùn)行任務(wù)時(shí),它會(huì)釋放工作線程,從而釋放工作線程所占用的資源。但是,但當(dāng)出現(xiàn)新任務(wù)時(shí),又要?jiǎng)?chuàng)建一新的工作線程,又要一定的系統(tǒng)開銷。并且,在使用CachedThreadPool時(shí),一定要注意控制任務(wù)的數(shù)量,否則,由于大量線程同時(shí)運(yùn)行,很有會(huì)造成系統(tǒng)癱瘓。 三就是向各位請(qǐng)教一下,請(qǐng)問各位使用過SingleThreadExecuto

5、r嗎?它一般使用在哪些地方? 剛研究了一下線程池,以上為個(gè)人學(xué)習(xí)過程以及觀點(diǎn),請(qǐng)勿見笑!下章,將分析一下JDK自帶線程池(ThreadPoolExecutor.java)源碼,如果感興趣,可看看。順便幫忙踩踩,呵呵! java線程池原理及簡單實(shí)例 在現(xiàn)代的操作系統(tǒng)中,有一個(gè)很重要的概念線程,幾乎所有目前流行的操作系統(tǒng)都支持線程,線程來源于操作系統(tǒng)中進(jìn)程的概念,進(jìn)程有自己的虛擬地址空間以及正文段、數(shù)據(jù)段 及堆棧,而且各自占有不同的系統(tǒng)資源(例如文件、環(huán)境變量等等)。與此不同,線程不能單獨(dú)存在,它依附于進(jìn)程,只能由進(jìn)程派生。如果一個(gè)進(jìn)程派生出了兩個(gè)線程,那這兩個(gè)線程共享此進(jìn)程的全局變量和代碼段,但

6、每個(gè)線程各擁有各自的堆棧,因此它們擁有各自的局部變量,線程在UNIX系統(tǒng)中還被進(jìn)一步分為用戶級(jí)線程(由進(jìn)程自已來管理)和系統(tǒng)級(jí)線程(由操作系統(tǒng)的調(diào)度程序來管理)。 既然有了進(jìn)程,為什么還要提出線程的概念呢?因?yàn)榕c創(chuàng)建一個(gè)新的進(jìn)程相比,創(chuàng)建一個(gè)線程將會(huì)耗費(fèi)小得多的系統(tǒng)資源,對(duì)于一些小型的應(yīng)用,可能感覺不到這點(diǎn),但對(duì)于那些并發(fā)進(jìn)程數(shù)特別多的應(yīng)用,使用線程會(huì)比使用進(jìn)程獲得更好的性能,從而降低操作系統(tǒng)的負(fù)擔(dān)。另外,線程共享創(chuàng)建它的進(jìn)程的全局變量,因此線程間的通訊編程會(huì)更將簡單,完全可以拋棄傳統(tǒng)的進(jìn)程間通訊的IPC編程,而采用共享全局變量來進(jìn)行線程間通訊。 有了上面這個(gè)概念,我們下面就進(jìn)入正題,來看一下

7、線程池究竟是怎么一回事?其實(shí)線程池的原理很簡單,類似于操作系統(tǒng)中的緩沖區(qū)的概念,它的流程如下:先啟動(dòng)若干數(shù)量的線程,并讓這些線程都處于睡眠狀態(tài),當(dāng)客戶端有一個(gè)新請(qǐng)求時(shí),就會(huì)喚醒線程池中的某一個(gè)睡眠線程,讓它來處理客戶端的這個(gè)請(qǐng)求,當(dāng)處理完這個(gè)請(qǐng)求后,線程又處于睡眠狀態(tài)。可能你也許會(huì)問:為什么要搞得這么麻煩,如果每當(dāng)客戶端有新的請(qǐng)求時(shí),我就創(chuàng)建一個(gè)新的線程不就完了?這也許是個(gè)不錯(cuò)的方法,因?yàn)樗苁沟媚憔帉懘a相對(duì)容易一些,但你卻忽略了一個(gè)重要的問題性能!就拿我所在的單位來說,我的單位是一個(gè)省級(jí)數(shù)據(jù)大集中的銀行網(wǎng)絡(luò)中心,高峰期每秒的客戶端請(qǐng)求并發(fā)數(shù)超過100,如果為每個(gè)客戶端請(qǐng)求創(chuàng)建一個(gè)新線程的話

8、,那耗費(fèi)的CPU時(shí)間和內(nèi)存將是驚人的,如果采用一個(gè)擁有 200個(gè)線程的線程池,那將會(huì)節(jié)約大量的的系統(tǒng)資源,使得更多的CPU時(shí)間和內(nèi)存用來處理實(shí)際的商業(yè)應(yīng)用,而不是頻繁的線程創(chuàng)建與銷毀。 既然一切都明白了,那我們就開始著手實(shí)現(xiàn)一個(gè)真正的線程池吧,線程編程可以有多種語言來實(shí)現(xiàn),例如C、C、java等等,但不同的操作系統(tǒng)提供不同的線程API接口,為了讓你能更明白線程池的原理而避免陷入煩瑣的API調(diào)用之中,我采用了JAVA語言來實(shí)現(xiàn)它,由于JAVA語言是一種跨平臺(tái)的語言,因此你不必為使用不同的操作系統(tǒng)而無法編譯運(yùn)行本程序而苦惱,只要你安裝了JDK1.2以上的版本,都能正確地編譯運(yùn)行本程序。另外JAVA

9、 語言本身就內(nèi)置了線程對(duì)象,而且JAVA語言是完全面像對(duì)象的,因此能夠讓你更清晰地了解線程池的原理,如果你注意看一下本文的標(biāo)題,你會(huì)發(fā)現(xiàn)整個(gè)示例程序的代碼只有大約100行。 本示例程序由三個(gè)類構(gòu)成,第一個(gè)是TestThreadPool類,它是一個(gè)測(cè)試程序,用來模擬客戶端的請(qǐng)求,當(dāng)你運(yùn)行它時(shí),系統(tǒng)首先會(huì)顯示線程池的初始化信息,然后提示你從鍵盤上輸入字符串,并按下回車鍵,這時(shí)你會(huì)發(fā)現(xiàn)屏幕上顯示信息,告訴你某個(gè)線程正在處理你的請(qǐng)求,如果你快速地輸入一行行字符串,那么你會(huì)發(fā)現(xiàn)線程池中不斷有線程被喚醒,來處理你的請(qǐng)求,在本例中,我創(chuàng)建了一個(gè)擁有10個(gè)線程的線程池,如果線程池中沒有可用線程了,系統(tǒng)會(huì)提示你

10、相應(yīng)的警告信息,但如果你稍等片刻,那你會(huì)發(fā)現(xiàn)屏幕上會(huì)陸陸續(xù)續(xù)提示有線程進(jìn)入了睡眠狀態(tài),這時(shí)你又可以發(fā)送新的請(qǐng)求了。 第二個(gè)類是ThreadPoolManager類,顧名思義,它是一個(gè)用于管理線程池的類,它的主要職責(zé)是初始化線程池,并為客戶端的請(qǐng)求分配不同的線程來進(jìn)行處理,如果線程池滿了,它會(huì)對(duì)你發(fā)出警告信息。 最后一個(gè)類是SimpleThread類,它是Thread類的一個(gè)子類,它才真正對(duì)客戶端的請(qǐng)求進(jìn)行處理,SimpleThread在示例程序初始化時(shí)都處于睡眠狀態(tài),但如果它接受到了ThreadPoolManager類發(fā)過來的調(diào)度信息,則會(huì)將自己喚醒,并對(duì)請(qǐng)求進(jìn)行處理。 首先我們來看一下Tes

11、tThreadPool類的源碼: package com.thread.simple; import java.io.*; public class TestThreadPool /* *param args */ public static void main(String args) try BufferedReader br = new BufferedReader(new InputStreamReader(System.in); String s; ThreadPoolManager manager = new ThreadPoolManager(10); while(s = br.

12、readLine() != null) cess(s); catch(IOException e) 由于此測(cè)試程序用到了輸入輸入類,因此第1行導(dǎo)入了JAVA的基本IO處理包,在第11行中,我們創(chuàng)建了一個(gè)名為manager的類,它給 ThreadPoolManager類的構(gòu)造函數(shù)傳遞了一個(gè)值為10的參數(shù),告訴ThreadPoolManager類:我要一個(gè)有10個(gè)線程的池,給我創(chuàng)建一個(gè)吧!第12行至15行是一個(gè)無限循環(huán),它用來等待用戶的鍵入,并將鍵入的字符串保存在s 變量中,并調(diào)用ThreadPoolManager類的 process方法來將這個(gè)請(qǐng)求進(jìn)行處理。 下面我們?cè)龠M(jìn)一步跟蹤到ThreadP

13、oolManager類中去,以下是它的源代碼: package com.thread.simple; import java.util.*; public class ThreadPoolManager private int maxThread; public Vector vector; public void setMaxThread(int threadCount) this.maxThread = threadCount; public ThreadPoolManager(int threadCount) this.setMaxThread(threadCount); System.

14、out.println(Starting thread pool.); vector = new Vector(); for(int i=1;i=10;i+) SimpleThread thread = new SimpleThread(i); vector.addElement(thread); thread.start(); public void process(String argument) int i; for(i = 0;ivector.size();i+) SimpleThread currentThread = (SimpleThread)vector.elementAt(i

15、); if(!currentThread.isRunning() System.out.println(Thread +(i+1)+ is processing:+argument); currentThread.setArgument(argument); currentThread.setRunning(true); return; if(i = vector.size() System.out.println(pool is full,try in another time.); 我們先關(guān)注一下這個(gè)類的構(gòu)造函數(shù),然后再看它的process()方法。第1624行是它的構(gòu)造函數(shù),首先它給Th

16、readPoolManager類的成員變量maxThread賦值,maxThread表示用于控制線程池中最大線程的數(shù)量。第18行初始化一個(gè)數(shù)組vector,它用來存放所有的SimpleThread類,這時(shí)候就充分體現(xiàn)了JAVA語言的優(yōu)越性與藝術(shù)性:如果你用C語言的話,至少要寫100行以上的代碼來完成vector的功能,而且C語言數(shù)組只能容納類型統(tǒng)一的基本數(shù)據(jù)類型,無法容納對(duì)象。好了,閑話少說,第1924行的循環(huán)完成這樣一個(gè)功能:先創(chuàng)建一個(gè)新的 SimpleThread類,然后將它放入vector中去,最后用thread.start()來啟動(dòng)這個(gè)線程,為什么要用start()方法來啟動(dòng)線程呢?因

17、為這是JAVA語言中所規(guī)定的,如果你不用的話,那這些線程將永遠(yuǎn)得不到激活,從而導(dǎo)致本示例程序根本無法運(yùn)行。 下面我們?cè)賮砜匆幌聀rocess()方法,第3040行的循環(huán)依次從vector數(shù)組中選取SimpleThread線程,并檢查它是否處于激活狀態(tài)(所謂激活狀態(tài)是指此線程是否正在處理客戶端的請(qǐng)求),如果處于激活狀態(tài)的話,那繼續(xù)查找vector數(shù)組的下一項(xiàng),如果vector 數(shù)組中所有的線程都處于激活狀態(tài)的話,那它會(huì)打印出一條信息,提示用戶稍候再試。相反如果找到了一個(gè)睡眠線程的話,那第3538行會(huì)對(duì)此進(jìn)行處理,它先告訴客戶端是哪一個(gè)線程來處理這個(gè)請(qǐng)求,然后將客戶端的請(qǐng)求,即字符串a(chǎn)rgumen

18、t轉(zhuǎn)發(fā)給SimpleThread類的setArgument()方法進(jìn)行處理,并調(diào)用SimpleThread類的setRunning()方法來喚醒當(dāng)前線程,來對(duì)客戶端請(qǐng)求進(jìn)行處理。 可能你還對(duì)setRunning()方法是怎樣喚醒線程的有些不明白,那我們現(xiàn)在就進(jìn)入最后一個(gè)類:SimpleThread類,它的源代碼如下: package com.thread.simple; public class SimpleThread extends Thread private boolean runningFlag; private String argument; public boolean isR

19、unning() return runningFlag; public synchronized void setRunning(boolean flag) runningFlag = flag; if(flag) this.notify(); public String getArgument() return this.argument; public void setArgument(String argument) this.argument = argument; public SimpleThread(int threadNumber) runningFlag = false; S

20、ystem.out.println(Thread +threadNumber+ started.); public synchronized void run() try while(true) if(!runningFlag) this.wait(); else System.out.println(processing +getArgument()+.done); sleep(5000); System.out.println(Thread is sleeping.); setRunning(false); catch(InterruptedException e) System.out.

21、println(Interrupt); /end of run() /end of class SimpleThread 如果你對(duì)JAVA的線程編程有些不太明白的話,那我先在這里簡單地講解一下,JAVA有一個(gè)名為Thread的類,如果你要?jiǎng)?chuàng)建一個(gè)線程,則必須要從 Thread類中繼承,并且還要實(shí)現(xiàn)Thread類的run()接口,要激活一個(gè)線程,必須調(diào)用它的start()方法,start()方法會(huì)自動(dòng)調(diào)用 run()接口,因此用戶必須在run()接口中寫入自己的應(yīng)用處理邏輯。那么我們?cè)趺磥砜刂凭€程的睡眠與喚醒呢?其實(shí)很簡單,JAVA語言為所有的對(duì)象都內(nèi)置了wait()和notify()方法,當(dāng)一

22、個(gè)線程調(diào)用wait()方法時(shí),則線程進(jìn)入睡眠狀態(tài),就像停在了當(dāng)前代碼上了,也不會(huì)繼續(xù)執(zhí)行它以下的代碼了,當(dāng)調(diào)用notify()方法時(shí),則會(huì)從調(diào)用wait()方法的那行代碼繼續(xù)執(zhí)行以下的代碼,這個(gè)過程有點(diǎn)像編譯器中的斷點(diǎn)調(diào)試的概念。以本程序?yàn)槔?,?8行調(diào)用了wait()方法,則這個(gè)線程就像凝固了一樣停在了38行上了,如果我們?cè)诘?3行進(jìn)行一個(gè)notify()調(diào)用的話,那線程會(huì)從第 38行上喚醒,繼續(xù)從第39行開始執(zhí)行以下的代碼了。 通過以上的講述,我們現(xiàn)在就不難理解SimpleThread類了,第914行通過設(shè)置一個(gè)標(biāo)志runningFlag激活當(dāng)前線程,第 2529行是SimpleThrea

23、d類的構(gòu)造函數(shù),它用來告訴客戶端啟動(dòng)的是第幾號(hào)進(jìn)程。第3150行則是我實(shí)現(xiàn)的run()接口,它實(shí)際上是一個(gè)無限循環(huán),在循環(huán)中首先判斷一下標(biāo)志runningFlag,如果沒有runningFlag為false的話,那線程處理睡眠狀態(tài),否則第4245行會(huì)進(jìn)行真正的處理:先打印用戶鍵入的字符串,然后睡眠5秒鐘,為什么要睡眠5秒鐘呢?如果你不加上這句代碼的話,由于計(jì)算機(jī)處理速度遠(yuǎn)遠(yuǎn)超過你的鍵盤輸入速度,因此你看到的總是第1號(hào)線程來處理你的請(qǐng)求,從而達(dá)不到演示效果。最后第45行調(diào)用setRunning()方法又將線程置于睡眠狀態(tài),等待新請(qǐng)求的到來。 最后還有一點(diǎn)要注意的是,如果你在一個(gè)方法中調(diào)用了wai

24、t()和notify()函數(shù),那你一定要將此方法置為同步的,即 synchronized,否則在編譯時(shí)會(huì)報(bào)錯(cuò),并得到一個(gè)莫名其妙的消息:“current thread not owner”(當(dāng)前線程不是擁有者)。 至此為止,我們完整地實(shí)現(xiàn)了一個(gè)線程池,當(dāng)然,這個(gè)線程池只是簡單地將客戶端輸入的字符串打印到了屏幕上,而沒有做任何處理,對(duì)于一個(gè)真正的企業(yè)級(jí)運(yùn)用,本例還是遠(yuǎn)遠(yuǎn)不夠的,例如錯(cuò)誤處理、線程的動(dòng)態(tài)調(diào)整、性能優(yōu)化、臨界區(qū)的處理、客戶端報(bào)文的定義等等都是值得考慮的問題,但本文的目的僅僅只是讓你了解線程池的概念以及它的簡單實(shí)現(xiàn),如果你想成為這方面的高手,本文是遠(yuǎn)遠(yuǎn)不夠的,你應(yīng)該參考一些更多的資料來

25、深入地了解它。 創(chuàng)建Java程序中線程池詳解 線程是Java的一大特性,它可以是給定的指令序列、給定的方法中定義的變量或者一些共享數(shù)據(jù)(類一級(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)(Runni

26、ng)。當(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請(qǐng)求的完成而進(jìn)入等待狀態(tài)。 在Java中不同的線程具有不同的優(yōu)先級(jí),高優(yōu)先級(jí)的線程可以安排在低優(yōu)先級(jí)線程之前完成。如果多個(gè)線程具有相同的優(yōu)先級(jí),Java會(huì)在不同的線程之間切換運(yùn)行。一個(gè)應(yīng)用程序可以通過使用線程中的方法setPriority()來設(shè)置線程的

27、優(yōu)先級(jí),使用方法getPriority()來獲得一個(gè)線程的優(yōu)先級(jí)。 線程的生命周期 一個(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ò)展http:/./doc/e4543a7a5acfa1c7aa00cc25.html ng.Thread類,另一種是通過http

28、:/./doc/e4543a7a5acfa1c7aa00cc25.html ng.Runnable 接口。世界經(jīng)理人電子商務(wù)網(wǎng)訊 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) Mythr

29、ead 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ò)展

30、其它某些類的特性時(shí),就需要借助運(yùn)行Runnable接口來實(shí)現(xiàn)。Runnable接口只有一個(gè)方法run()。不論什么時(shí)候創(chuàng)建了一個(gè)使用Runnable接口的類,都必須在類中編寫run()方法來覆蓋接口中的run()方法。例如下面的代碼就是通過Runnable接口實(shí)現(xiàn)的線程:世界經(jīng)理人電子商務(wù)網(wǎng)訊 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è)請(qǐng)求到達(dá)就創(chuàng)建一個(gè)新線程,開銷是相當(dāng)大的。在實(shí)際使用中,每個(gè)請(qǐng)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論