资源简介
代码片段和文件信息
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
评论
共有 条评论