資源簡介

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