-
大小: 3KB文件類型: .rar金幣: 2下載: 0 次發(fā)布日期: 2021-05-04
- 語(yǔ)言: Java
- 標(biāo)簽:
資源簡(jiǎn)介

代碼片段和文件信息
import?java.util.linkedList;
/**
????功能:一個(gè)線程池是一組有限數(shù)量的線程,它們被用來(lái)完成執(zhí)行任務(wù)
翻寫作者:Arkliszeng
時(shí)間:2010-02-21
地點(diǎn):北大青鳥(niǎo)錦江中心學(xué)術(shù)部
版本:ver?1.0.0
備注:
線程池使用ThreadGroup?API來(lái)實(shí)現(xiàn).線程組表示一個(gè)線程的集合。
此外,線程組也可以包含其他線程組。線程組構(gòu)成一棵樹(shù),在樹(shù)中,
除了初始線程組外,每個(gè)線程組都有一個(gè)父線程組。允許線程訪問(wèn)
有關(guān)自己的線程組的信息,但是不允許它訪問(wèn)有關(guān)其線程組的父線
程組或其他任何線程組的信息。
*/
public?class?ThreadPool?extends?ThreadGroup?{
????private?boolean?isAlive;?//表示線程是否活首
????private?linkedList?taskQueue;?//定義一個(gè)雙向隊(duì)列
????private?int?threadID;?//保存線程的ID
????private?static?int?threadPoolID;?//表示線程池的ID
????/**
????????在構(gòu)造方法創(chuàng)建線程池
????????@參數(shù)numThreads用來(lái)指定池中的線程個(gè)數(shù)
????*/
????public?ThreadPool(int?numThreads)?{
????????super(“線程池-“?+?(threadPoolID++));
????????setDaemon(true);//讓該線程組為精靈線程組
????????isAlive?=?true;//設(shè)置初始值為true
????????taskQueue?=?new?linkedList();//初始化任務(wù)隊(duì)列
????????for?(int?i=0;?i ????????????new?PooledThread().start();//啟動(dòng)池中的線程
????????}
????}
????/**
????????功能:請(qǐng)求一個(gè)新的任務(wù)來(lái)運(yùn)行,該方法立即返回。然后任務(wù)在下一下空閑
???????? 的線程中執(zhí)行。該方法是線程安全的。
????????任務(wù)開(kāi)始執(zhí)行時(shí)有序的到達(dá)時(shí)開(kāi)始。
????????@參數(shù)task表示運(yùn)行的任務(wù)。如果不null那么沒(méi)有任務(wù)執(zhí)行。
????????@如果本ThreadPool關(guān)閉了,那么拋出IllegalStateException。
????*/
????public?synchronized?void?runTask(Runnable?task)?{
???? //如果線程池的狀態(tài)isAlive==false值
????????if?(!isAlive)?{
????????????throw?new?IllegalStateException();//那么拋出異常
????????}
????????//如果任務(wù)不為null
????????if?(task?!=?null)?{
???????? //那么在任務(wù)把該任務(wù)加入任務(wù)階段
????????????taskQueue.add(task);
????????????//然后喚醒空閑的線程執(zhí)行該任務(wù)
????????????notify();
????????}
????}
/**
功能:獲取任務(wù)對(duì)象
*/
????protected?synchronized?Runnable?getTask()?throws?InterruptedException{
???? //如果任務(wù)隊(duì)列不是空的
????????while?(taskQueue.size()?==?0)?{
???????? //如果線程池的狀態(tài)isAlive==false值
????????????if?(!isAlive)?{
????????????????return?null;?//那么返回null值
????????????}
????????????wait();//否則等待任務(wù)出現(xiàn)(添加任務(wù))
????????}
????????//否則任務(wù)隊(duì)列中的一個(gè)任務(wù)對(duì)象
????????return?(Runnable)taskQueue.removeFirst();
????}
????/**
????????功能:關(guān)閉該線程池并且立即返回。讓所有線程停止執(zhí)行,并且所有等待任務(wù)停止執(zhí)行。
???????? 一旦一個(gè)ThreadPool被關(guān)閉了,那么該線程池中的所有的線程不再運(yùn)行。
????*/
????public?synchronized?void?close()?{
???? //如果線程池是活的
????????if?(isAlive)?{
?? //那么置為false
????????????isAlive?=?false;
????????????//然后把任務(wù)隊(duì)列清空
????????????taskQueue.clear();
????????????//最后終止線程池中所有線程的運(yùn)行
????????????interrupt();
????????}
????}
????/**
????????功能:關(guān)閉該ThreadPool活動(dòng)然后等待所有的線程運(yùn)行完成。這樣所有等待的任務(wù)會(huì)被執(zhí)行。
????*/
????public?void?join()?{
????????//?當(dāng)ThreadPool不再活動(dòng)時(shí)喚醒所有等待的線程
????????synchronized?(this)?{
????????????isAlive?=?false;
????????????notifyAll();
????????}
????????//?然后等待所有池中的線程對(duì)象執(zhí)行完畢
????????Thread[]?threads?=?new?Thread[activeCount()];?//創(chuàng)建所有池中的活動(dòng)線程
????????//把此線程組及其子組中的所有活動(dòng)線程復(fù)制到指定數(shù)組中
????????int?count?=?enumerate(threads);
????????//然后按序讓每個(gè)線程執(zhí)行完畢
????????for?(int?i=0;?i ????????????try?{
????????????????threads[i].join();
????????????}
????????????catch?(InterruptedException?ex)?{?}
????????}
????}
????/**
????????功能:定義線程池中的線程,這些線程對(duì)象用來(lái)運(yùn)行任務(wù)對(duì)象(Runnables)
??????
?屬性????????????大小?????日期????時(shí)間???名稱
-----------?---------??----------?-----??----
?????文件???????5259??2010-02-21?15:08??ThreadPool.java
?????文件???????1673??2010-02-21?15:50??ThreadPoolTest.java
-----------?---------??----------?-----??----
?????????????????6932????????????????????2
評(píng)論
共有 條評(píng)論